多线程应用上的易失性 C/C++
Volatile C/C++ on a multithread app
我对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
本身执行同步并防止您担心的问题类型。
看看
我的回答 这里.
底下喜欢,不要聪明都是用易失性尽量保证线程安全,用得适当
相关文章:
- 易失性sig_atomic_t的内存安全性
- C++易失性:保证 32 位访问?
- 避免易失性和非易失性成员函数的代码重复
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 如何访问常量易失性 std::array?
- 为什么在 C++20 中弃用易失性?
- 根据 MSVC,具有易失性成员的结构不再是 POD
- 是否允许编译器优化掉局部易失性变量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 如何避免对无锁程序使用易失性?
- C++:易失性实例中的易失性成员函数 - 将数组分配给指针是无效的转换?
- g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化
- 是什么让这种易失性打破了结构的指针算法?
- 如果不需要易失性,为什么 std::atomic 方法会提供易失性重载
- *(易失性无符号整数 *) 的含义 0x00 = 0x00;
- 使用易失性 c 字符串和 std::cout
- 易失性结构 = 结构不可能,为什么?
- 如何强制 GCC 以线性方式转换易失性内联程序集语句
- 我可以使用互斥锁或关键字(静态)代替C++中的易失性吗?
- 兼容的声明 __attribute__ ((节( ".abc.dfe" ))) 常量易失性 uint8 属性变量 = 0;- 符合MISRA标准