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

Volatile C/C++ on a multithread app

本文关键字:C++ 易失性 应用 多线程      更新时间:2023-10-16

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

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

我用一个例子来解释:

Thread1: //(affects it behaviour with the variable)
mymutex.lock();
if(variable)
{
   ...
   variable = false;
}
mymutex.unlock();

Thread2:
mymutex.lock();
variable = true;
mymutex.unlock();

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

问这个是因为我有一个不能易失性的std::vector而不是变量。而且我不能 100% 确定如果没有 volatile 关键字,这种方法是安全的。

谢谢。

编辑:正确重新表述问题。

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

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

因此,无论哪种情况,您都需要同步,例如使用std::mutex(您确实提到了)。现在,如果这样做,则无需volatile受该mutex保护的变量。mutex本身执行同步并防止您担心的问题类型。

看看

我的回答 这里.

底下喜欢,不要聪明都是用易失性尽量保证线程安全,用得适当