int x = 0 // global shared variable
T1: for (i=0; i++; i<100) x++;
T2: x++ // no loop, just one increment
T1和T2是单独的线程。我被告知x的最终值可以是1和101的值的任何值。这怎么可能?我想知道这怎么可能只是1.
显然,执行顺序失败了,但我想知道是什么。
答案 0 :(得分:6)
x++
is not atomic operation(至少在大多数语言中),此操作实际上是这样的:
tmp = x;
tmp = tmp + 1;
x = tmp;
现在假设下一个执行顺序:
T2: tmp = x; // tmp is 0
T1: run all loop iterations, finally x is 100
T2: tmp = tmp+1; x = tmp; // x is 1
获取任何其他数字,想象下一个订单:
T1: started loop, at some point x is 45
T2: tmp = x; // tmp is 45
T1: finished loop, x is 100
T2: tmp = tmp+1; x = tmp; // x is 46
答案 1 :(得分:0)
这种行为的原因是内存缓存。由于线程可以在独立的cpu上执行,因此可能出现以下情况:
T1:加载x值
T2:加载x值
T1:运行循环10次(T1_x = 10)
T2:增量(T2_x = 1)
T1:将值10保存到存储器
T2:将值1保存到记忆中
这就是您需要线程同步的原因。您可以在此处阅读更多内容:Mutex example / tutorial?
谢谢@Lashane的纠正。