マルチコアと同期

条件変数で「キューが空でなくなるまで待つ」とき、待ちから起きた後に条件をif文ではなくwhile文で確かめ直す理由として正しいものはどれか。

  1. Awhile文の方がif文より実行が速いから
  2. Bif文では条件変数を使えない決まりだから
  3. C起こされても、ほかのスレッドが先に取ってしまったり、理由なく起きたりして、条件が満たされていない可能性があるから
答えと解説を見る

正解:C. 起こされても、ほかのスレッドが先に取ってしまったり、理由なく起きたりして、条件が満たされていない可能性があるから

条件変数の待ちは、ロックを手放して眠り、知らせを受けて起きるとロックを取り直して戻ります。しかし起きるまでの間に、ほかのスレッドが先にロックを取ってキューの要素を持っていくことがあります。また、実装の都合で知らせがなくても起きること(見かけ上の起床)が認められています。そのため、起きた後に条件を確かめ、満たされていなければもう一度待つwhile文で書きます。

  • A. 速さの問題ではありません。
  • B. そのような決まりはありません。
  • C. 正しい。起きた後に条件を確かめ直す必要があります。
この分野を解く 分野ページへ

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

  1. 2つのコアがそれぞれ自分のキャッシュに変数xのコピーを持っている。コア0がxに書き込んだあと、コア1がxを読むときに、キャッシュコヒーレンシの仕組みがなければ起こりうる問題はどれか。
  2. キャッシュコヒーレンシのプロトコルであるMESIの4つの状態の組み合わせとして正しいものはどれか。
  3. MESIプロトコルでキャッシュのラインがModified(M)状態にあるときの意味として正しいものはどれか。
  4. MESIプロトコルで、Exclusive(E)状態のラインにそのコアが書き込むときの動作として正しいものはどれか。
  5. 無効化型のコヒーレンシプロトコルで、あるコアがShared(S)状態のラインに書き込むときに行われることはどれか。