多线程系统中不受保护的get函数 - 需要volatile吗?

时间:2011-06-04 23:18:53

标签: c++ multithreading volatile

我正在开发一个多线程程序,它提供对进程间通信系统一端的访问。从未使用过volatile,我试图找出它的正确用法 我理解(相关部分)volatile告诉编译器它应用的变量可能被写入该线程的指令序列之外,所以它应该在每次使用时重新读取内存。

我已经查看了一些关于volatile的教程,但大多数都有最简单的例子(例如全局共享变量)或者只是相互复制。然后我不时地看到有人认为挥发性没有做你认为它做的事情。此外,有些人说,如果你不是在编写设备驱动程序或其他类似的设备驱动程序,则不应使用volatile(Is 'volatile' needed in this multi-threaded C++ code?)。在这一点上,我的大脑处于一个结,我甚至不知道我担心的事情是否是真正的问题。所以我想知道在OOP中是否有任何易用性的示例代码我可以看一下。

但特别是,我主要担心的是外部使用getter函数。在我的代码中,我使用的所有东西都得到了适当的保护,但是,我确实为私有成员变量提供了一些我不保护的getter函数(类似于这个问题Overhead of pthread mutexes?,尤其是第一个答案的最后一段,或者unprotected access to member in property get)因为我不想将我的写作线程绑定,特别是如果多个其他线程在循环中使用get函数等待。

我担心如果我没有将使用get函数访问的变量设置为volatile,那么如果某个外部程序在循环中等待它,那么该外部程序的编译器可能不会重新读取该变量程序将保持无限循环。这是一个有效的问题吗?

非常相似question is here,但我不确定c ++的答案是什么。

2 个答案:

答案 0 :(得分:3)

在C ++中,volatile不用于多线程(至少像Java 5中那样提供内存屏障等)。在C ++ 0x中,有原子变量,它最接近Java 5风格的volatile

答案 1 :(得分:3)

你提到的“有些人”是完全正确的。使用volatile可确保每次在代码中执行此操作时读取或写入内存位置。它确实保证该值是当前的,或者可能由可能在单独的核心或单独的CPU上运行的其他线程看到。为此你需要一个记忆障碍。

在设备驱动程序中使用时,要读取或写入外部硬件,这不是问题,因为硬件已映射到非缓存内存。