我对种族情况有疑问。问题是:
考虑以下两个线程,在共享中并发运行 内存(所有变量在两个线程之间共享)。
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?
答案 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的结果。