竞态条件场景

3

我有一个关于竞态条件的问题。问题如下:

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

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(包括2和10)。我理解结果为5:10,但是x如何是2、3或4呢?
1个回答

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的结果。


嗨@nhahtdh,我不理解您所应用的逻辑。请提供一些链接以了解底层逻辑。此外,线程2如何读/写4次,而线程1只读取一次。您能帮助我吗? - rakeshNS
@rakeshNS:你知道x = x + 1涉及到读取寄存器中的x值,然后(进行计算,并)将新值写入表示变量x的内存中(读取先于写入)。两个线程的总读写次数为5。线程之间的上下文切换会保留每个线程寄存器中的值,但由于内存中x的位置对于两个线程是相同的,当线程在读/写之间切换时,问题就会发生。 - nhahtdh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接