有一对夫妇在这个网站,询问使用是否问题volatile变量原子/多线程访问是可能的:见这里,这里,还是这里的例子.
现在,符合C(++)标准的答案显然没有.
但是,在Windows和Visual C++编译器上,情况似乎并不那么清楚.
微软特定
声明为volatile的对象是(...)
- 对volatile对象的写入(volatile write)具有Release语义; 对全局或静态对象的引用?在编译二进制文件中的易失性写入之前,将在写入指令序列中的易失性对象之前发生这种情况.
- 读取volatile对象(volatile read)具有Acquire语义; 对全局或静态对象的引用 ?在读取编译二进制文件中的易失性读取之后,将在读取指令序列中的易失性存储器之后发生这种情况.
这允许volatile对象用于多线程应用程序中的内存锁定和释放.
[强调我的]
现在,读到这一点,在我看来,MS编译器将处理一个易变量变量,就像std::atomic即将推出的C++ 11标准一样.
然而,在对我的回答的评论中,用户Hans Passant写道:"那篇MSDN文章非常不幸,这是错误的.你不能用volatile来实现锁定,甚至不能使用微软的版本.(...)"
请注意:MSDN中给出的示例看起来很可疑,因为您通常无法在没有原子交换的情况下实现锁定.(正如亚历克斯所指出的那样)这仍然留下了问题.有关此MSDN文章中给出的其他信息的有效性,特别是对于此处和此处的用例.)
此外,还有Interlocked*函数的文档,尤其是InterlockedExchange带有volatile(!?)变量并进行原子读取和写入.(注意我们在SO上有一个问题 - 何时应该使用InterlockedExchange? - 没有权威性地回答是否需要这个函数来进行只读或只写原子访问.)
更重要的是,volatile上面引用的文档以某种方式暗示"全局或静态对象",我认为"真正的" 获取/释放语义应该适用于所有值. …