我刚开始学习交错,我有一个程序包含以下两个过程:
流程#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为7”?
答案 0 :(得分:0)
打印“x为7”的过程在执行if-test时必须“看到”x不是-7,但是x必须在printf()
时变为7读取其值以将其打印出来。所以,像:
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”优化和重新排序代码,还有许多其他方式可能会使事情变得奇怪。 - 如“规则等”