マルチコアと同期

デッドロックの例として正しいものはどれか。

  1. Aスレッド1がロックAを持ってロックBを待ち、スレッド2がロックBを持ってロックAを待っている
  2. B2つのスレッドが同じ変数を同期なしに書き換えて、値が壊れる
  3. C1つのスレッドがロックを取ってすぐに解放する
答えと解説を見る

正解:A. スレッド1がロックAを持ってロックBを待ち、スレッド2がロックBを持ってロックAを待っている

デッドロックは、複数のスレッドがそれぞれ資源を持ったまま、ほかのスレッドが持つ資源を待ち合い、誰も先に進めなくなる状態です。例では、スレッド1はBが空くのを、スレッド2はAが空くのを待ちますが、どちらも自分のロックを手放さないので永久に止まります。CPUを使わずに止まるので、外から見ると処理が固まったように見えます。

  • A. 正しい。互いに相手を待ち続けて進めません。
  • B. それはデータ競合です。
  • C. 問題のない普通の使い方です。
この分野を解く 分野ページへ

マルチコアと同期のほかの問題

  1. 複数のロックを使うプログラムで、デッドロックを防ぐ方法として最も一般的なものはどれか。
  2. メモリ一貫性モデル(メモリコンシステンシモデル)が定めているものはどれか。
  3. 逐次一貫性(シーケンシャルコンシステンシ)の説明として正しいものはどれか。
  4. 上の2つのスレッドを別々のコアで同時に実行する(コンパイラによる並べ替えはないとする)。逐次一貫性では起こらないが、x86などの実際のCPUでは起こりうる結果はどれか。
  5. x86のメモリ一貫性モデル(TSO、トータルストアオーダー)の特徴として正しいものはどれか。