顺序一致性(执行顺序等于代码顺序)
第6章废话太多,又一次重复顺序一致性的缺点,会导致重排序都不能使用。
happen-before规则
Initially, A == B == 0
Thread 1 Thread 2
1: B = 1; 3: A = 2
2: r2 = A; 4: r1 = B
在上面的例子中,执行的顺序可能是:
1 B = 1
3 A = 2
2 r2 = A // 可能r2看到的A是0
4 r1 = B // 可能r1看到的b是0
由于代码3和代码2没有happen-before的关系,r2看到的A可能是0.
同样的,r1看到的B可能也是0,因为代码4和代码1也没有happen-before的关系
另一种执行顺序可能是:
2: r2 = A; // r2看到A = 2
4: r1 = B // r1看到B = 1
1: B = 1
3: A = 2
这行为看上去是很荒唐的,一次读操作能看到之前才执行的写操作的结果。但是在happen-before规则中,并没有明确说明这样的结果是不合规则的,因为代码2和代码3之间没有happen-before关系。综上,用happen-before规则作为内存模型是不够的。