从文档中:
微软特定
当使用 /volatile:ms 编译器选项时(默认情况下,当针对 ARM 以外的体系结构时)编译器生成额外的代码来维护对 volatile 对象的引用之间的顺序,以及维护对其他全局对象的引用的顺序。特别是:
- 对 volatile 对象的写入(也称为 volatile 写入)具有 Release 语义;也就是说,
在指令
序列中写入易失性对象之前发生的对全局或静态对象的引用将发生在已编译
二进制文件中的易失性写入之前。- 对 volatile 对象的读取(也称为 volatile 读取)具有 Acquire 语义;也就是说,
在指令序列中读取易失性存储器之后发生的对全局或静态对象的引用
将发生在编译二进制文件中的易失性读取之后。这使得 volatile 对象可以用于多线程应用程序中的内存锁定和释放。
它肯定会保证volatile
防止编译器执行编译时指令重新排序(因为它明确指出指令序列在编译后的二进制文件中是相同的)。
但我们都知道,还有硬件重排序之类的东西(比如 CPU 能够根据自己的意愿重新排序指令)。是否volatile
也能阻止它?我知道同步原语(例如互斥锁)可以,但是特定于 MS 的volatile
呢?