【发布时间】:2013-11-24 20:27:40
【问题描述】:
在阅读了其他开发人员编写的一些代码后出现了这个问题,所以我做了一些研究,发现了 Andrei Alexandrescu 的文章。在他的article 中,他说可以使用 volatile 布尔变量来忙等待(请参阅第一个带有 Wait/Wakeup 的示例)
class Gadget
{
public:
void Wait()
{
while (!flag_)
{
Sleep(1000); // sleeps for 1000 milliseconds
}
}
void Wakeup()
{
flag_ = true;
}
...
private:
bool flag_;
};
我真的不明白它是如何工作的。
- volatile 不保证操作是原子的。实际上,对布尔变量的读/写是原子的,但理论并不能保证这一点。在我看来,上面的代码可以使用 C++11 安全地重写,方法是使用 std::atomic::load/store 函数和相应的获取/释放内存排序约束。
- 我们在所描述的示例中没有这个问题,但是如果我们有不止一次写入,我们可能会遇到内存排序问题。 Volatile 不是栅栏,它不强制内存排序,它只是阻止编译器优化。
那么为什么这么多人使用 volatile bool 来忙等待,它真的便携吗?
【问题讨论】:
-
我不是这方面的权威,但我的直觉和你一样。此外,可能值得注意的是,您的代码中没有
volatile bools ;)也可能文章可以追溯到 2001 年 2 月 1 日。 -
Possible answer 关于几乎重复的问题。
-
是的,你是对的。我从第一个示例中复制了源代码,他稍后添加了 volatile。让我解决这个问题。
-
@Lightness Races in Orbit:感谢您的链接,看起来很有趣。我现在去看看。
标签: c++ multithreading volatile memory-fences busy-waiting