我刚刚开始学习交错,我有一个包含以下两个过程的程序:
流程#1:
shared int x;
x = 7;
while true {
x = x - 1;
x = x + 1;
if (x != 7)
printf("x is %d", x);
流程#2:
shared int x:
x = 7;
while true {
x = x - 1;
x = x + 1;
if (x != 7)
printf("x is %d", x);
如果交错的顺序没有限制,我该如何排序或交错这两个进程以打印"x is 7"?
打印"x is 7">
的过程必须在执行 if-test 的那一刻"看到"x 不是 7,但是当 x 读取其值以打印出来时,x 必须变为 7printf()
。 所以,像这样:
Process #1: x = x - 1; // x becomes 6
Process #2: x = x - 1; // x becomes 5
Process #1: x = x + 1; // x becomes 6
Process #1: if (x != 7) // if-test succeeds, because x is 6
Process #2: x = x + 1; // x becomes 7
Process #1: printf("x is %d", x); // prints "x is 7"
请注意,这只是上述可能发生的一种方式;特别是如果x
没有被原子地修改,还有许多其他方式也会变得奇怪,由于寄存器分配,CPU缓存交互,编译器使用"as-if"规则优化和重新排序代码等。