陷入并发编程示例,伪代码(原子动作/细粒度原子性)

时间:2011-10-16 04:06:50

标签: multithreading concurrency shared-memory imperative-programming

我的book提供了一个简单的例子,我有点困惑:

它说,“考虑以下程序,并假设细粒度的原子动作正在读取和写入变量:”

int y = 0, z = 0;
co x = y+z; // y=1; z=2; oc;

“如果通过使用y加载寄存器然后将z添加到其中来实现x = y + z,则x的最终值可以是0,1,2或3.”

2? 2如何工作?

注意:co启动并发进程,//表示并行运行语句

2 个答案:

答案 0 :(得分:5)

在你的程序中有两个平行序列:

序列1:x = y+z;

序列2:y=1; z=2;

序列1的操作是:

  1. y将y的值复制到寄存器中。
  2. + z将z的值添加到寄存器中的值。
  3. x =将寄存器的值复制到x。
  4. 序列2的操作是:

    1. y=1;将y的值设置为1。
    2. z=2;将z的值设置为2。
    3. 这两个序列同时运行,但序列中的步骤必须按顺序进行。因此,您可以按以下顺序获取x值“2”:

      1. y=0
      2. z=0
      3. y将y的值复制到寄存器中。 (注册值现在为'0')
      4. y=1;将y的值设置为1.(对结果没有影响,我们已经将y复制到寄存器中)
      5. z=2;将z的值设置为2。
      6. + z将z的值添加到寄存器中的值。 (注册值现在为'2')
      7. x =将寄存器的值复制到x中。 (x的值现在为'2')

答案 1 :(得分:0)

由于假设它们并行运行,我认为当分配x = y + z出现时,更简单的情况可能是y = 0,z = 2。