种族情况

时间:2012-06-19 02:13:17

标签: c concurrency parallel-processing

我对种族情况有疑问。问题是:

  

考虑以下两个线程,在共享中并发运行   内存(所有变量在两个线程之间共享)。

Thread A 
for i = 1 to 5 do 
  x = x + 1;

Thread B 
for j = 1 to 5 do
  x = x + 1;
  

假设一个单处理器系统,那个加载和存储是原子的,   x被初始化为0,并且必须将x加载到寄存器中   在增加之前(并在之后存储回内存),什么   两个线程完成后是x的所有可能值吗?

现在答案是2:10(含)。我理解5:10的结果,但x怎么可能是2,3或4?

1 个答案:

答案 0 :(得分:4)

得到x = 2的序列:

Thread 2 read // Reg_2 = 0
Thread 1 read/write 4 times // x = 4
Thread 2 write // * Reg_2 = 0 --> x = 1
Thread 1 read // Reg_1 = 1
Thread 2 read/write 4 times // x = 5
Thread 1 write // Reg_1 = 1 --> x = 2

根据在标记为*的步骤中抢占之前写入线程2的数量,您将获得3和4的结果。