私は、次の SO の質問に対する受け入れられた回答を注意深く調べてきました: C++0x にはセマフォがありませんか? スレッドを同期する方法は?
その回答のセマフォ実装では、wait()
関数の実装は次のとおりです。
void wait()
{
boost::mutex::scoped_lock lock(mutex_);
while(!count_)
condition_.wait(lock);
--count_;
}
条件の目的を理解しようとしていwhile(!count_)
ます。
別の SO の質問 (セマフォのこの実装はどのように機能しますか? )に対する回答notify_one()
は、条件変数で が呼び出されたときに、その条件変数で待機している複数のスレッドが起動される可能性があることを示していますwhile
。ループ。while
私はこれを確認したいと思います - それは完全かつ/または正しい答えですか、それともループが必要な理由は他にありますか?
複数のスレッドが起動する場合、どのスレッドがミューテックスを所有していますか? 考えれば考えるほど、 への 1 回の呼び出しで複数のスレッドがウェイクアップできる場合、定義が不明確に思えますnotify_one()
。ウェイクアップされた両方のスレッドがcount_
値を 0 よりも大きい値として認識し、両方の decrement に進みcount_
、結果としてcount_
値が 0 未満になり、セマフォの目的 (および正しさ) を無効にすることはできないでしょうか?