5

私は、次の 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 未満になり、セマフォの目的 (および正しさ) を無効にすることはできないでしょうか?

4

1 に答える 1

3

すでに述べたように、偽の wakeupsが発生するか、notify_one実装の詳細により複数のスレッドが起動する可能 性があります。

複数のスレッドを起動しても、それらすべてが同時に保護されたセクションに入ることができるという意味ではなく、ThreadA がロックを解放すると、ThreadB (前の例では ThreadA とともに起動された) も取得されることを意味します。保護されたセクションに入ります。この時点で、ThreadA はすでに作業を完了しているため、ThreadB は、ThreadA がcount変数を見つけたのと同じ状態で変数を認識しません。

于 2012-11-16T07:45:50.447 に答える