我的书提供了一个简单的例子,我对此有点困惑:
它说,“考虑以下程序,并假设细粒度的原子操作正在读取和写入变量:”
int y = 0, z = 0;
co x = y+z; // y=1; z=2; oc;
“如果x = y + z
是通过加载一个带有y的寄存器然后添加z来实现的,x的最终值可以是0、1、2或3。”
2?2如何工作?
注意:co 启动一个并发进程和 // 表示并行运行的语句
我的书提供了一个简单的例子,我对此有点困惑:
它说,“考虑以下程序,并假设细粒度的原子操作正在读取和写入变量:”
int y = 0, z = 0;
co x = y+z; // y=1; z=2; oc;
“如果x = y + z
是通过加载一个带有y的寄存器然后添加z来实现的,x的最终值可以是0、1、2或3。”
2?2如何工作?
注意:co 启动一个并发进程和 // 表示并行运行的语句
在您的程序中有两个并行序列:
序列1:x = y+z;
序列2:y=1; z=2;
序列1的操作是:
y
将 y 的值复制到寄存器中。+ z
将 z 的值与寄存器中的值相加。x =
将寄存器的值复制到 x 中。序列2的操作是:
y=1;
将 y 的值设置为 1。z=2;
将 z 的值设置为 2。这两个序列同时运行,尽管序列中的步骤必须按顺序发生。因此,您可以按以下顺序获得 x 值“2”:
y=0
z=0
y
将 y 的值复制到寄存器中。(寄存器值现在为“0”)y=1;
将 y 的值设置为 1。(对结果没有影响,我们已经将 y 复制到了寄存器中)z=2;
将 z 的值设置为 2。+ z
将 z 的值与寄存器中的值相加。(寄存器值现在是“2”)x =
将寄存器的值复制到 x 中。(x 的值现在是 '2')由于假设它们是并行运行的,我认为当赋值 x = y + z 发生时,更简单的情况可能是 y=0, z=2。