两个线程并发执行以下代码,假设a是全局变量,初始为1,那么以下输出______是可能的?
1
2
3
4
|
void foo(){ a=a+1; printf ( "%d " ,a); } |
3 2
2 3
3 3
2 2
正确答案: A B C D 你的答案: B C D (错误)
-
编译出来(一般来讲)大概会是这么几步:
- 读a
- +1
- 写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_
先执行所有[1]再执行所有[2]就得到B了。
C
- [1]读a
- [1]+1
- [1]写a // a = 2
- [2]读a
- [2]+1
- [2]写a // a = 3
- [1]再读a
- [2]再读a
- ...
D
- [1]读a
- [2]读a
- [1]+1
- [2]+1
- [1]写a // a = 2
- [2]写a // a = 2
- ....