出典:
2つの等価スレッドが同時に以下のプログラムを実行し、aはグローバル変数であり、初期は0であり、printf、+、–操作が原子的であると仮定すると、出力はどちらではないに違いない.
void foo() {
if(a <= 0) {
a++
}
else {
a--
}
printf("%d", a)
}
オプション:A.01 B.10 C.12 D.22
原子操作とは?
原子動作とは、実行中に他のコードパスによって中断されない動作を指す. は、整数原子操作とビット原子操作の2種類に分けられる. 本題はprintf,+,–操作がすべて原子的であると仮定し,これらの操作は中断されず,保存現場は存在しないという説である.では,これらの文の前後が途切れると得られる異なる結果を考える. PS:理論的には++は原子操作とは考えられず、aはグローバル変数であり、メモリでは、++aはメモリからaを取りレジスタ、+、メモリに戻る3ステップに分けられるのが一般的である.
問題を解く:
Aオプション:p 1に対して実行判断データを選択する、printfを実行することを決定し、中断し、P 2の実行が完了する、p 1を実行し、結果は01ではなく00である. Bオプション:P 1実行プログラム、出力1、P 2実行プログラム、出力0; Cオプション:初期は0、P 1は判断文を実行し終わって、a++を実行することを決定して、中断して、P 2は判断して、この時aは依然として0に等しくて、判断文を実行して、そして入力を実行して、1を得て、P 1はそれから引き続き実行して、この時それはa++を実行して、この時a=1、実行して負けて、結果は2です; D解答:初期は0、P 1は判断文を実行し終わって、a++を実行することを決定して、中断して、P 2は判断を行って、この時aは依然として0に等しくて、a++を実行して、a=1を得て、中断して、P 1は引き続きa++を実行して、a=2、P 1は出力して、2を得て、P 1は終了して、P 2は引き続き出力文を実行して、2を得ます;