C++ boost条件需要可变变量

C++ 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

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_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命名空间中的某些类型中提供了这些变量。