マルチコアと同期

複数のロックを使うプログラムで、デッドロックを防ぐ方法として最も一般的なものはどれか。

  1. Aすべてのスレッドがロックを取る順番を、プログラム全体で同じに決めておく
  2. Bロックを取ったら、絶対に解放しないようにする
  3. Cスレッドの数を2つ以下にする
答えと解説を見る

正解:A. すべてのスレッドがロックを取る順番を、プログラム全体で同じに決めておく

デッドロックは、スレッドが互いに相手の持つロックを待つ「輪」ができると起こります。例えば「必ずAを取ってからBを取る」と全員が守れば、Bを持ってAを待つスレッドは現れず、輪ができません。ほかにも、一度に必要なロックをまとめて取る、取れなければ持っているロックを放してやり直す、などの方法があります。

  • A. 正しい。待ち合いの輪ができなくなります。
  • B. 解放しなければ、ほかのスレッドが永久に待ちます。
  • C. 2つのスレッドでもデッドロックは起きます。
この分野を解く 分野ページへ

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

  1. メモリ一貫性モデル(メモリコンシステンシモデル)が定めているものはどれか。
  2. 逐次一貫性(シーケンシャルコンシステンシ)の説明として正しいものはどれか。
  3. 上の2つのスレッドを別々のコアで同時に実行する(コンパイラによる並べ替えはないとする)。逐次一貫性では起こらないが、x86などの実際のCPUでは起こりうる結果はどれか。
  4. x86のメモリ一貫性モデル(TSO、トータルストアオーダー)の特徴として正しいものはどれか。
  5. ARMやRISC-V(RVWMO)のような弱いメモリ一貫性モデルについて正しいものはどれか。