Rya*_*ker 0 multithreading operating-system
int x = 0 // global shared variable
T1: for (i=0; i++; i<100) x++;
T2: x++ // no loop, just one increment
Run Code Online (Sandbox Code Playgroud)
T1和T2是单独的线程.我被告知x的最终值可以是1和101的值的任何值.这怎么可能?我想知道这可能只是1.
显然,执行顺序失败了,但我想知道是什么.
x++不是原子操作(至少在大多数语言中),这个操作实际上是这样的:
tmp = x;
tmp = tmp + 1;
x = tmp;
Run Code Online (Sandbox Code Playgroud)
现在假设下一个执行顺序:
T2: tmp = x; // tmp is 0
T1: run all loop iterations, finally x is 100
T2: tmp = tmp+1; x = tmp; // x is 1
Run Code Online (Sandbox Code Playgroud)
获得任何其他数字,想象下一个订单:
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
Run Code Online (Sandbox Code Playgroud)