多线程应用程序上的易失性C/C++

Dar*_*ros 2 c++ multithreading volatile

我对volatile使用情况有疑问.我通常会尝试跨线程共享的所有变量都有volatile关键字以确保直接内存访问,当然还有互斥锁保护.

但是,volatile如果共享变量以确保一致性,是否真的需要?

我用一个例子来解释:

Thread1: //(affects it behaviour with the variable)
mymutex.lock();
if(variable)
{
   ...
   variable = false;
}
mymutex.unlock();
Run Code Online (Sandbox Code Playgroud)
Thread2:
mymutex.lock();
variable = true;
mymutex.unlock();
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,thread2仅写入和thread1读/写.是否可能variable缓存并且线程不读取新值?即使互斥锁设置正确吗?volatile在这种情况下我需要吗?

我问这个因为而不是变量我有一个std::vector,它不能挥发.如果没有volatile关键字,我不能100%确定这种方法是安全的.

谢谢.

编辑:正确地重新制定问题.

Age*_*ien 5

volatile在C++中并不意味着并发.它是关于是否允许编译器优化远离变量的读取.它主要用于诸如通过内存映射与硬件接口之类的事情.

不幸的是,这意味着即使您确实有volatile变量,读取和写入仍然可以访问未同步的线程本地存储.另外,a std::vector不是线程安全的.

因此,在任何一种情况下,您都需要进行同步,例如使用std::mutex(您提到的).现在,如果这样做,那些受其保护的变量mutex就不需要了volatile.它mutex本身可以实现同步并防止您担心的问题类型.

  • 正确答案.我只想强调已经说过的内容:"volatile"不适用于线程同步.如果有人使用volatile来同步线程,那么代码仍然不正确的可能性大于90%,但会更慢.Ofc有一些有效的上下文在线程中使用volatile,但很少,通常在实现低级同步原语(如自旋锁)时. (2认同)