正如我最近发表的 这个答案中所展示的那样,我似乎对 volatile
在多线程编程环境中的实用性(或缺乏实用性)感到困惑。
我的理解是: 任何时候,当一个变量可能在访问它的一段代码的控制流之外被更改时,那个变量应该被声明为 volatile
。信号处理程序、 I/O 寄存器和其他线程修改的变量都构成了这种情况。
因此,如果你有一个全局 int foo
,而且 foo
是由一个线程读取并由另一个线程自动设置的(可能使用了一个合适的指令) ,那么读取线程看待这种情况的方式与它看待一个由信号处理程序调整的变量或者由外部硬件条件修改的变量的方式是一样的,因此 foo
应该被声明为 volatile
(或者,对于多线程情况,使用内存隔离加载访问,这可能是一个更好的解决方案)。
我哪里做错了?