C ++中对象的volatile关键字

时间:2013-03-12 21:12:55

标签: multithreading thread-safety volatile stdatomic

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

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

有人可以提供更深入的了解吗?

2 个答案:

答案 0 :(得分:0)

看看:volatile (C++) msdn article

你不必因为

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

答案 1 :(得分:0)

没有。没有必要将对象声明为原子。

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

使用atomic,它已经达到了volatile要执行的操作,因此无需声明volatile