现代 CPU 架构通常会采用性能优化,这可能会导致无序执行。在单线程应用程序中,内存重新排序也可能发生,但它对程序员来说是不可见的,就好像内存是按程序顺序访问的一样。对于 SMP,内存屏障来拯救它,用于强制执行某种内存排序。
我不确定的是单处理器中的多线程。考虑以下示例:当线程 1 运行时,存储 tof
可能发生在存储 to 之前x
。假设上下文切换发生在f
写入之后,就在x
写入之前。现在线程 2 开始运行,它结束循环并打印 0,这当然是不可取的。
// Both x, f are initialized w/ 0.
// Thread 1
x = 42;
f = 1;
// Thread 2
while (f == 0)
;
print x;
上面描述的场景可能吗?或者是否可以保证在线程上下文切换期间提交物理内存?
根据这个维基,
当程序在单 CPU机器上运行时,硬件会执行必要的簿记,以确保程序执行就像所有内存操作都按照程序员指定的顺序(程序顺序)执行一样,因此不需要内存屏障。
虽然它没有明确提到单处理器多线程应用程序,但它包括了这种情况。
我不确定它是否正确/完整。请注意,这可能高度依赖于硬件(弱/强内存模型)。因此,您可能希望在答案中包含您知道的硬件。谢谢。
PS。设备 I/O 等不是我关心的问题。它是一个单核单处理器。
编辑:感谢 Nitsan 的提醒,我们假设这里没有编译器重新排序(只是硬件重新排序),并且线程 2 中的循环没有被优化掉。再次,魔鬼在细节中。