我有个关于种族状况的问题。问题是:
考虑以下两个线程,在共享内存中并发运行(所有变量都在两个线程之间共享)。
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呢?
发布于 2012-06-19 02:23:21
得到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的结果。
https://stackoverflow.com/questions/11093524
复制相似问题