int global = 0;
// thread 1
for(int i = 0; i < 10; ++i)
global -= 1;
// thread 2
for(int i = 0; i < 10; ++i)
global += 1;
之后global的可能的值是多少(多种可能)?
这个问题考虑的是全局变量global的加减操作不是原子操作,在加减过程中有可能被打断,从而产生的结果与预期不一样。上述global加减操作的汇编如下
;windows下加操作
mov eax,dword ptr [globle (10A9148h)]
add eax,1
mov dword ptr [globle (10A9148h)],eax
;windows下减操作
mov eax,dword ptr [globle (10A9148h)]
sub eax,1
mov dword ptr [globle (10A9148h)],eax
;linux下加操作
movl global, %eax
addl $1, %eax
movl %eax, global
;linux下减操作
movl global, %eax
subl $1, %eax
movl %eax, global
可见,不论加减都要经过global的值加载到eax,然后eax加减1,最后再写回global中。这时如果线程1的global的值刚加载到eax中,线程2获取到了执行权,就会出现问题。具体看下面例子。
假设操作前global值为5。
线程1 &nb