C++ boost条件需要可变变量
HyC++ boost条件需要可变变量,c++,boost-thread,C++,Boost Thread,Hy 我已经开始使用C++中的线程(Boost线程), 我发现自己处于以下情况: boost::mutex::scoped_lock lk(monitor); while (buffered == 0) { buffer_not_empty.wait(lk); } 我想知道缓冲的int变量是否应该是易变的。 我想说,为了防止这样的优化,在编译时应该: boost::mutex::scoped_lock lk(monitor); while (true) { buffer_not
我已经开始使用C++中的线程(Boost线程), 我发现自己处于以下情况:
boost::mutex::scoped_lock lk(monitor);
while (buffered == 0) {
buffer_not_empty.wait(lk);
}
我想知道缓冲的int变量是否应该是易变的。
我想说,为了防止这样的优化,在编译时应该:
boost::mutex::scoped_lock lk(monitor);
while (true) {
buffer_not_empty.wait(lk);
}
但由于这是boost文档中的一个示例,我可能遗漏了一些东西
锁/互斥锁/条件是否足以阻止此类优化?就像在java中一样?您不需要处理volatile
volatile
与多线程绝对无关。即使编译器没有按照您提到的循环进行优化,您的CPU也可能会进行相同的优化,并且volatile
不会影响CPU
wait
应包含必要的内存屏障指令,以使其按预期运行。您无需处理volatile
volatile
与多线程绝对无关。即使编译器没有按照您提到的循环进行优化,您的CPU也可能会进行相同的优化,并且volatile
不会影响CPU
等待
应包含必要的内存屏障指令,以使其按预期运行。好的,谢谢,我没有找到关于此的任何好信息ok,谢谢,我没有找到关于此的任何好信息监视器
锁保护变量。这就足够了。这意味着事情就像在java中一样,任何锁都会保护变量事实上,任何锁都会保护在该锁下一致访问的所有变量。C++11还将通过原子类型为您提供无锁变量,但AFAIR boost不提供这些变量,尽管事实上它在details命名空间中至少有一些类型具有这些变量。监视器
锁保护变量。这就足够了。这意味着事情就像在java中一样,任何锁都会保护变量事实上,任何锁都会保护在该锁下一致访问的所有变量。C++11还将通过原子类型为您提供无锁变量,但AFAIR boost没有提供这些变量,尽管事实上它至少在details命名空间中的某些类型中提供了这些变量。