2012-06-19 58 views
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(含)。我明白5:10的结果,但x怎么可能是2,3或4?

回答

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

+0

感谢非常多;) – Milk

+0

嗨@nhahtdh我不明白你应用的逻辑。请给出一些链接来了解下层逻辑。另外线程2如何读/写4次,而线程1只读一次。你能帮我 – rakeshNS

+0

@rakeshNS:你知道x = x + 1涉及读取寄存器x的值,然后(做计算,并且)将新值写入表示变量x的内存(读取先于写入)。两个线程的读/写总数为5.线程之间的上下文切换为每个线程保留了寄存器中的值,但由于两个线程的x在内存中的位置相同,因此当线程在读取之间切换时会发生问题/写。 – nhahtdh