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