两个线程并发执行以下代码,假设a是全局变量,初始为1,那么以下输出______是可能的?
生活随笔
收集整理的這篇文章主要介紹了
两个线程并发执行以下代码,假设a是全局变量,初始为1,那么以下输出______是可能的?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
兩個線程并發(fā)執(zhí)行以下代碼,假設a是全局變量,初始為1,那么以下輸出______是可能的?
void foo(){
? ? a=a+1;
? ? printf("%d ",a);
}
正確答案: A B C D ??
3 2
2 3
3 3
2 2
解析:
A:3, 2
y先執(zhí)行++a,a為2;
y再執(zhí)行printf,a入棧,在打印到終端之前切換到x
x執(zhí)行++a,a為3;
x執(zhí)行printf,輸出3;再切換到y(tǒng)
y執(zhí)行打印,輸出2
B:2 3
x先執(zhí)行++a,a為2;
x再執(zhí)行printf,輸出2;切換到y(tǒng)
y執(zhí)行++a,a為3;
y執(zhí)行printf,輸出3;
C:3 3
x先執(zhí)行++a,a為2;切換到y(tǒng)
y執(zhí)行++a,a為3;
y執(zhí)行printf,輸出3;切換到x
x執(zhí)行printf,輸出3
D:2 2
類似C,a的初始值為0即可
這里關鍵有兩點:
(1)兩個線程可隨時被搶占
(2)++a和printf不是原子指令,可隨時被打斷;特別注意函數printf,a作為參數壓棧后,a再變化則不會影響輸出(printf實際打印的是壓棧的參數,是值拷貝的棧變量)
void foo(){
? ? a=a+1;
? ? printf("%d ",a);
}
正確答案: A B C D ??
3 2
2 3
3 3
2 2
解析:
A:3, 2
y先執(zhí)行++a,a為2;
y再執(zhí)行printf,a入棧,在打印到終端之前切換到x
x執(zhí)行++a,a為3;
x執(zhí)行printf,輸出3;再切換到y(tǒng)
y執(zhí)行打印,輸出2
B:2 3
x先執(zhí)行++a,a為2;
x再執(zhí)行printf,輸出2;切換到y(tǒng)
y執(zhí)行++a,a為3;
y執(zhí)行printf,輸出3;
C:3 3
x先執(zhí)行++a,a為2;切換到y(tǒng)
y執(zhí)行++a,a為3;
y執(zhí)行printf,輸出3;切換到x
x執(zhí)行printf,輸出3
D:2 2
類似C,a的初始值為0即可
這里關鍵有兩點:
(1)兩個線程可隨時被搶占
(2)++a和printf不是原子指令,可隨時被打斷;特別注意函數printf,a作為參數壓棧后,a再變化則不會影響輸出(printf實際打印的是壓棧的參數,是值拷貝的棧變量)
總結
以上是生活随笔為你收集整理的两个线程并发执行以下代码,假设a是全局变量,初始为1,那么以下输出______是可能的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++中未定义行为
- 下一篇: 计算机网络中各层的协议图表(TCP/IP