单处理器中,多进程或多线程之间是否需要使用内存屏障

在看Linux内核内存屏障时,文章中写道“只有在存在多CPU交互或CPU与设备交互的情况下才可能需要用到内存屏障.”,对此表示怀疑,难道单CPU中,两个进程或两个线程间就不需要用了么?

 使用LOCK和UNLOCK之后, 一般就不再需要其他内存屏障了(但是注意"MMIO写屏障"章节中所提到的例外).

只有在存在多CPU交互或CPU与设备交互的情况下才可能需要用到内存屏障. 如果可以确保某段代码中不存在这样的交互, 那么这段代码就不需要使用内存屏障. (译注: CPU乱序执行指令, 同样会导致寄存器的存取顺序被打乱, 但是为什么不需要寄存器屏障呢? 就是因为寄存器是CPU私有的, 不存在跟其他CPU或设备的交互.)

http://blog.csdn.net/michaelcao1980/article/details/21241087

@oyljerry
!!!请大神调教啊。。。。。

对于这种情况:
举例来说, 考虑如下的操作序列:

CPU 1 CPU 2
=============== ===============
{ A == 1; B == 2 }
A = 3; x = A;
B = 4; y = B;

这一组访问指令在内存系统(见上图的中间部分)上生效的顺序, 可以有24种不同的组合:

STORE A=3, STORE B=4, x=LOAD A->3, y=LOAD B->4
STORE A=3, STORE B=4, y=LOAD B->4, x=LOAD A->3
STORE A=3, x=LOAD A->3, STORE B=4, y=LOAD B->4
STORE A=3, x=LOAD A->3, y=LOAD B->2, STORE B=4
STORE A=3, y=LOAD B->2, STORE B=4, x=LOAD A->3
STORE A=3, y=LOAD B->2, x=LOAD A->3, STORE B=4
STORE B=4, STORE A=3, x=LOAD A->3, y=LOAD B->4
STORE B=4, ...
...

然后这就产生四种不同组合的结果值:

x == 1, y == 2
x == 1, y == 4
x == 3, y == 2
x == 3, y == 4

上面是原文对于CPU1和CPU2。
而对于线程P1和线程P2,P1和P2之间乱序加中断,同样可能出现如下访问组合
举例来说, 考虑如下的操作序列:

P1 P2
=============== ===============
{ A == 1; B == 2 }
A = 3; x = A;
B = 4; y = B;

这一组访问指令在内存系统(见上图的中间部分)上生效的顺序, 可以有24种不同的组合:

STORE A=3, STORE B=4, (中断,执行P2) x=LOAD A->3, y=LOAD B->4
STORE A=3, STORE B=4, (中断,执行P2)y=LOAD B->4, x=LOAD A->3
STORE A=3, (中断,执行P2)x=LOAD A->3,(中断,执行P1)STORE B=4,(中断,执行P2) y=LOAD B->4
STORE A=3, (中断,执行P2)x=LOAD A->3, y=LOAD B->2, (中断,执行P1)STORE B=4
STORE A=3, (中断,执行P2)y=LOAD B->2, (中断,执行P1)STORE B=4,(中断,执行P2) x=LOAD A->3
STORE A=3,(中断,执行P2) y=LOAD B->2, x=LOAD A->3, (中断,执行P1)STORE B=4
STORE B=4, STORE A=3, (中断,执行P2)x=LOAD A->3, y=LOAD B->4
STORE B=4, ...
...

然后这就产生四种不同组合的结果值:

x == 1, y == 2
x == 1, y == 4
x == 3, y == 2
x == 3, y == 4

这与上面CPU1,CPU2的乱序一样的啊,为什么CPU1和CPU2需要内存屏障,P1和P2难道就不需要的了啊。
不懂啊,请大神调教。。

对于线程,不存在这种关系,除非用到共享数据
对于进程亦然
进程,线程本身,并不要求共享数据,除非你的线程,进程里 共享数据,否则不会有 乱序问题
如果你使用共享数据,请加锁,以保证 对共享数据的操作的原子性。

CPU内部乱序执行,CPU可以自行解决,所以也不存在这个问题。