我有一个在几个线程之间共享的变量(假设有适当的同步方法)。
我应该将变量定义为volatile?
我要问的原因是:以下任何一个都可以作为答案:
是:因为变量可以由线程更改而其他线程应该知道它。
否:由于编译器可以理解变量的值在CPU内存上并且哪个线程想要读取它并不重要,编译器会处理它。
答案 0 :(得分:3)
如果您有适当的同步,则无需volatile
。
如果您没有适当的同步,那么volatile
不能提供合适的同步,尽管在某些C ++实现中它似乎有助于或多或少的帮助。
答案 1 :(得分:0)
通常,只有在库API需要时才使用volatile
(例如Windows上的原子操作)。
在非常低级别的编程中存在处理可能需要volatile
的硬件的情况。
答案 2 :(得分:0)
volatile
(几乎)无用。它旨在与内存映射硬件连接时使用。尽管C ++标准在变量的获取或释放语义方面没有提及volatile
,但某些特定平台确实会为volatile
添加额外的功能或限制。例如,在Windows 2010中(至少)Acquire和Release语义确实适用于volatile
变量上的某些操作:
Microsoft特定
在某些优化中不使用声明为volatile的对象 因为他们的价值观可以随时改变。系统总是读取 在请求点处的volatile对象的当前值, 即使先前的指令要求来自同一对象的值。 此外,在分配时立即写入对象的值。 优化时,编译器必须维护引用之间的顺序 to volatile对象以及对其他全局对象的引用。在 尤其是,
对volatile对象的写入(volatile write)具有Release语义;一个 引用在写入之前发生的全局或静态对象 指令序列中的volatile对象将在此之前发生 volatile编译在已编译的二进制文件中。
读取volatile对象(volatile read)具有Acquire语义;一个 引用读取后发生的全局或静态对象 之后将发生指令序列中的易失性存储器 在编译的二进制文件中读取volatile。
http://msdn.microsoft.com/en-us/library/12a04hfd%28v=vs.100%29.aspx