マルチコアと同期
条件変数で「キューが空でなくなるまで待つ」とき、待ちから起きた後に条件をif文ではなくwhile文で確かめ直す理由として正しいものはどれか。
- Awhile文の方がif文より実行が速いから
- Bif文では条件変数を使えない決まりだから
- C起こされても、ほかのスレッドが先に取ってしまったり、理由なく起きたりして、条件が満たされていない可能性があるから
答えと解説を見る
正解:C. 起こされても、ほかのスレッドが先に取ってしまったり、理由なく起きたりして、条件が満たされていない可能性があるから
条件変数の待ちは、ロックを手放して眠り、知らせを受けて起きるとロックを取り直して戻ります。しかし起きるまでの間に、ほかのスレッドが先にロックを取ってキューの要素を持っていくことがあります。また、実装の都合で知らせがなくても起きること(見かけ上の起床)が認められています。そのため、起きた後に条件を確かめ、満たされていなければもう一度待つwhile文で書きます。
- A. 速さの問題ではありません。
- B. そのような決まりはありません。
- C. 正しい。起きた後に条件を確かめ直す必要があります。