マルチコアと同期
上のコードで、スレッド1がdataを用意してからflagで知らせ、スレッド2がflagを見てからdataを読む。弱いメモリ一貫性モデルのCPUで、スレッド2が確実に42を読むために必要なこととして正しいものはどれか。
// スレッド1 // スレッド2
data = 42; while (flag == 0) { }
flag = 1; print(data);
- Adataの型をintからlongに変える
- Bflagへの書き込みを解放(release)、flagの読み出しを取得(acquire)として順番を保証する
- Cスレッド2のループの中に何も書かないようにする
答えと解説を見る
正解:B. flagへの書き込みを解放(release)、flagの読み出しを取得(acquire)として順番を保証する
弱いモデルでは、スレッド1の2つの書き込みが入れ替わって見えたり、スレッド2のdataの読み出しがflagの読み出しより先に行われたりする可能性があり、flagが1なのにdataが古いままということが起こりえます。flagへの書き込みを解放にすると、それより前の書き込みが先に見えることが保証され、flagの読み出しを取得にすると、それより後の読み出しが先回りしなくなります。
- A. 型を変えても順番は保証されません。
- B. 正しい。dataの書き込みがflagより先に見えることが保証されます。
- C. ループの中身は順番の保証と関係ありません。