你这个问题找得好。确实他前面说的是cache问题,但是后面举的那个例子是指令重排。
编译器的指令重排、cpu的指令重排(乱序)、cpu缓存一致性,会导致数据操作的结果非预期,
是c++的memory model引入那几种memory order的原因。
【 在 babyArm 的大作中提到: 】
: 我怎么觉得这人把指令乱序和cache同步搞混了
: "表面上看,r1==r2==0这种输出是不可能出现的,然而,有一种可能性是,由于r1不依赖于x,编译器可以把r1=y这步操作调整到x=1这步操作之前,同样,r2=x这步操作可以调整到y=1这步操作之前,这样一来,core 1可以先读取L1 cache中的y的值,core 2 才执行 y = 1的赋值操作,同理,r2 = x这步操作也可以在x=1这步赋值操作之前执行,这时候就会出现r1 == r2 ==0的输出结果。"
: 有两种可能都会出现这种情况,一种是他说的指令乱序,一种是thread1拿到的y,和thread2拿到的x都是cache中,两个线程对x,y的读写互相不可见。这人前面说了一段cache,cpu架构,然后又扯指令乱序,是不是没搞清楚。而且java里面处理这个情况,用volatile是最方便的,他竟然扯半天互斥锁。
--
FROM 123.115.133.*