题目:个线程并发执行以下代码,假设a是全局变量,初始值是1,那么以下输出中()是可能的。
void foo ( )
{
++a
printf("%d",a);
}
A. 3_2_
B. 2_3_
C. 3_3_
D. 2_2_
答案:ABCD
解析:
++不能认为是原子操作,a是全局变量,在内存中,则++a一般被分为从内存取a到寄存器、+、回写到内存三步,考虑到并发。
设两个线程,[1]和[2]:
A
[1]读a
[1]+1
[1]写a // a =2
[1]再读a
[2]读a
[2]+1
[2]写a // a = 3
[2]再读a
[2]写到屏幕上 // 3_
[1]写到屏幕上 // 2_B
先执行所有[1]再执行所有[2]就得到B了。C
[1]读a
[1]+1
[1]写a // a = 2
[2]读a
[2]+1
[2]写a // a = 3
[1]再读a
[2]再读a
…
就得到3_3_了,但如果没有再读a的步骤,就是_2_3或者_3_2了。D
[1]读a
[2]读a
[1]+1
[2]+1
[1]写a // a = 2
[2]写a // a = 2就得到2_2_了