c++ - 使用 volatile bool 变量进行忙等待

标签 c++ multithreading volatile memory-fences busy-waiting

在阅读了其他开发人员编写的一些代码后出现了这个问题,所以我做了一些研究,发现了 Andrei Alexandrescu 的文章。在他的article他说可以使用 volatile bool 变量进行忙等待(参见第一个等待/唤醒示例)

class Gadget
{
public:
    void Wait()
    {
        while (!flag_)
        {
            Sleep(1000); // sleeps for 1000 milliseconds
        }
    }
    void Wakeup()
    {
        flag_ = true;
    }
    ...
private:
    bool flag_;
};

我真的不明白它是如何工作的。

  1. volatile 不保证操作是原子的。实际上,对 bool 变量的读/写是原子的,但理论并不能保证这一点。在我看来,上面的代码可以通过使用 std::atomic::load/store 函数和相应的获取/释放内存排序约束,用 C++11 安全地重写。
  2. 我们在描述的示例中没有这个问题,但是如果我们有超过一次的写入,我们可能会遇到内存排序问题。 Volatile 不是栅栏,它不强制内存排序,它只是阻止编译器优化。

那么为什么这么多人使用 volatile bool 来进行忙等待,它真的可以移植吗?

最佳答案

这篇文章并没有说 volatile 就是您所需要的(事实上,它不是),只是说它很有用。

If you do this, and if you use the simple generic component LockingPtr, you can write thread-safe code and worry much less about race conditions, because the compiler will worry for you and will diligently point out the spots where you are wrong.

关于c++ - 使用 volatile bool 变量进行忙等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19933422/

相关文章:

java - 如何访问作为线程的一部分发生的异常信息?

multithreading - D 语言 - 线程与生成

java - 多线程场景下的 volatile+synchronized 组合

java - 我应该在 Java EE 应用程序中的什么位置(确切地)使用同步

c++ - 非立方区域的 Morton 曲线是 2 的幂

c++ - 需要帮助在 Windows 上正确设置 CLANG

java - LIBSVM线程安全吗

java - 相对于其他字段的易变语义

c++更新 boost 版本问题

c++ - 从文本文件读取到结构 vector ,但文本文件行的长度不同