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%确定这种方法是安全的.
谢谢.
编辑:正确地重新制定问题.
volatile在C++中并不意味着并发.它是关于是否允许编译器优化远离变量的读取.它主要用于诸如通过内存映射与硬件接口之类的事情.
不幸的是,这意味着即使您确实有volatile变量,读取和写入仍然可以访问未同步的线程本地存储.另外,a std::vector不是线程安全的.
因此,在任何一种情况下,您都需要进行同步,例如使用std::mutex(您提到的).现在,如果这样做,那些受其保护的变量mutex就不需要了volatile.它mutex本身可以实现同步并防止您担心的问题类型.