ご存知のように、条件変数は、誤ったウェイクアップを回避するためにサイクルで呼び出す必要があります。このような:
while (not condition)
condvar.wait();
別のスレッドが待機中のスレッドをウェイクアップする場合は、条件フラグをtrueに設定する必要があります。例えば:
condition = true;
condvar.notify_one();
このシナリオで条件変数がブロックされる可能性はありますか?
1)待機中のスレッドは条件フラグをチェックし、それがFALSEに等しいことを検出したため、condvar.wait()
ルーチンに入ります。
2)ただし、この直前(ただし、条件フラグのチェック後)に、待機中のスレッドがカーネルによってプリエンプトされます(タイムスロットの有効期限などのため)。
3)このとき、別のスレッドが待機中のスレッドに状態を通知したいと考えています。条件フラグをTRUEに設定し、呼び出しますcondvar.notify_one();
4)カーネルスケジューラが最初のスレッドを再度実行すると、condvar.wait()
ルーチンに入りますが、通知はすでに欠落しています。
したがって、condvar.wait()
ウェイクアップ通知がなくなったため、条件フラグがTRUEに設定されていても、待機中のスレッドを終了することはできません。
出来ますか?