原子操作とスレッドの同時実行


出典:


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を得ます;