【问题标题】:volatile keyword for objects in C++C++ 中对象的 volatile 关键字
【发布时间】:2013-03-12 21:12:55
【问题描述】:

我有一个线程安全的计数器对象(它是一个使用 std::atomic load() 和 store() 的类) 作为班级成员之一。线程 1 递增计数器,线程 2 读取计数器。

通常,由不同线程共享的原始类型( int 等)被声明为 volatile 以防止任何编译器优化。我是否必须将这个由 2 个不同线程共享的线程安全计数器对象声明为 volatile ?

有人可以提供更多的见解吗?

【问题讨论】:

    标签: multithreading thread-safety volatile stdatomic


    【解决方案1】:

    没有。如果对象被声明为原子的,则不需要。

    C 或 C++ 编译器不得对易失性内存位置的读取和写入重新排序,也不得省略对易失性内存位置的读取或写入。

    通过使用atomic,它已经实现了volatile想要做的事情,所以不需要声明volatile

    【讨论】:

    • 你的意思是说如果对象实现原子操作就足够了吗?
    • 我很怀疑。我认为 atomic 不能保证防止编译器优化。
    • @KodeWarrior 你真的对原子操作有任何想法吗?您的对象受互斥锁保护,编译器如何优化互斥锁保护...
    • 我确实对原子操作有很好的了解。这就是为什么我认为你的说法是错误的!如果变量是在寄存器中分配的,即使操作是原子的,来自另一个线程的读/写也不会被反射。
    • @KodeWorrior: std:atomic in C++ 也带走了编译器优化,看看msdn.microsoft.com/en-us/library/vstudio/hh874894.aspx
    【解决方案2】:

    看看:volatile (C++) msdn article

    你不必这样做,因为

    • "C++11 ISO 标准代码中的 volatile 关键字仅用于硬件访问;不要将其用于线程间通信。对于线程间通信,请使用 std::atomic 等机制C++ 标准模板库。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2011-02-08
      • 2012-04-01
      相关资源
      最近更新 更多