1

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

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

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

4

2 回答 2

0

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

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

通过使用atomic,它已经达到了volatile预期的目的,所以不需要声明volatile

于 2013-03-12T21:29:51.517 回答
0

看看:volatile (C++) msdn文章

你不必因为

  • “C++11 ISO 标准代码中的 volatile 关键字仅用于硬件访问;请勿将其用于线程间通信。对于线程间通信,请使用 C++ 标准模板中的 std::atomic 等机制图书馆。”
于 2013-03-12T21:27:08.117 回答