20180517 线程

两个线程并发执行以下代码,假设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]: 


    • [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了。


    • [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了。 


    • [1]读a
    • [2]读a
    • [1]+1
    • [2]+1
    • [1]写a // a = 2
    • [2]写a // a = 2
    • ....
    就得到2_2_了
原文地址:https://www.cnblogs.com/kxzh/p/9107673.html