【问题标题】:boost condition needs volatile variables升压条件需要易变的变量
【发布时间】:2011-09-12 13:10:31
【问题描述】:

喂,

我已经开始使用 C++ 中的线程(增强线程), 我发现自己处于以下情况:

boost::mutex::scoped_lock lk(monitor);
while (buffered == 0) {
    buffer_not_empty.wait(lk);
}

如果 int 变量 buffered 应该是 volatile,我正在徘徊。 我会说它应该在编译时防止这样的优化:

boost::mutex::scoped_lock lk(monitor);
while (true) {
    buffer_not_empty.wait(lk);
}

但由于这是来自 boost 文档的示例,我可能遗漏了一些东西...

锁/互斥/条件是否足以防止这种优化?像在java中一样?

【问题讨论】:

  • monitor 锁保护变量。够了。
  • 这意味着事情就像在java中一样,任何锁都会保护变量
  • 确实,任何锁都会保护在该锁下一致访问的所有变量。 C++11 还将通过原子类型为您提供无锁变量,但 AFAIR boost 没有提供它们,尽管它实际上在 details 命名空间中至少为某些类型提供了它们。

标签: c++ boost-thread


【解决方案1】:

你不必惹volatilevolatile 与多线程完全无关。即使编译器不会以某种方式优化您提到的循环,您的 CPU 也可能会进行相同的优化,并且volatile 不会影响 CPU。

wait 应包含必要的内存屏障指令,使其按预期运行。

【讨论】:

  • 好的,谢谢,我没找到任何好的信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多