现代CPU架构通常采用可以导致乱序执行的性能优化。在单线程应用程序中,可能会发生内存重排序,但对程序员来说,这是不可见的,就好像内存是按程序顺序访问的一样。而对于SMP,内存屏障则用于强制执行某种内存顺序。
我不确定的是,在单处理器的情况下多线程如何实现。考虑以下示例:当线程1运行时,对f
的存储可以在对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中的循环没有被优化掉..再次强调,魔鬼在细节中。
f
设置为volatile,这样循环条件就不会被优化掉;) 现在,问题(我想要关注的问题)仍然存在,对吧? - Eric Z