Multithreading C+中对象的volatile关键字+;

Multithreading C+中对象的volatile关键字+;,multithreading,thread-safety,volatile,stdatomic,Multithreading,Thread Safety,Volatile,Stdatomic,我有一个线程安全计数器对象(它是一个使用std::atomic load()和store()的类) 作为班级成员之一。线程1递增计数器,线程2读取计数器 通常,由不同线程共享的基元类型(int等)被声明为volatile,以防止任何编译器优化。我是否必须将两个不同线程共享的线程安全计数器对象声明为volatile 有人能对此提供更多的见解吗?看看: 你不必这么做,因为 “C++”11标准中的易失性关键字仅用于硬件访问,不用于线程间通信。对于线程间通信,使用诸如C++的标准模板库中的STD:原子

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

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

有人能对此提供更多的见解吗?

看看:

你不必这么做,因为

    “C++”11标准中的易失性关键字仅用于硬件访问,不用于线程间通信。对于线程间通信,使用诸如C++的标准模板库中的STD:原子:
否。如果对象声明为原子对象,则不需要

一个C或C++编译器可能不会重新读取和写入易失性内存位置,也不会忽略对易失性内存位置的读写。p>


通过使用
atomic
,它已经达到了
volatile
的目的,因此不需要声明
volatile

你的意思是说如果对象实现原子操作就足够了吗?我很怀疑。我认为原子并不能保证防止编译器优化。@KodeWarrier你真的对原子操作有什么想法吗?你的对象受互斥保护,编译器如何优化互斥保护…我对原子操作有很好的了解。这就是为什么我认为你的说法是错误的!如果变量登记在寄存器中,即使操作是原子的,也不会反映来自另一个线程的读/写。@ KodeWorrior:STC++:C++中的原子也可以去除编译器优化,看看