一些线程怎么可能永远不会执行?

时间:2016-03-22 18:16:03

标签: multithreading operating-system

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.

显然,执行顺序失败了,但我想知道是什么。

2 个答案:

答案 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的纠正。