4

次のように、時間間隔なしで std::condition_variable::notify_one() を 2 回呼び出した場合、待機しているスレッドの数がウェイクアップします。

{
    std::unique_lock<std::mutex> lock(condvar_mutex);

    condvar.notify_one();
    condvar.notify_one();
}

これらの通知が同じスレッドに何度も配信されるのではなく、異なるスレッドに配信されるという保証はありますか?

4

2 に答える 2

4

§30.5.1.7: *this を待機しているスレッドがブロックされている場合、それらのスレッドの 1 つをブロック解除します。

1 つのスレッドであるというだけで、異なるスレッドであるという保証はありません。2 つの呼び出しの間にnotify_one、最初の呼び出しで起動された同じスレッドnotify_oneが再度ブロックされる可能性があります。

たとえば、次の例では、スレッド 3 がウェイクするかどうかは保証されません (この例では偽のウェイクは無視してください)。

- thread 1:

1    condvar.notify_one();
- 3 and 4 could run here.
2    condvar.notify_one();

- thread 2:

3    condvar.wait(/*...*/);
4    condvar.wait(/*...*/);

- thread 3:

5    condvar.wait(/*...*/);
于 2013-02-26T08:07:10.403 に答える
1

それcondvar_mutexが condvar の正しいミューテックスだと思います。

両方の通知を同じスレッドに配信することはできません。その理由は、mutex を保持している間にnotify_one2 回呼び出すためです。したがって、どちらのスレッドが最初にブロック解除されても、mutex を取得する方法がないため、から戻ることはできません。最初にミューテックスを取得しないと、例外をスローすることさえできません。waitwait_for

待機から抜け出すことができないため、2 番目notify_oneが呼び出される前にウェイターのリストに戻る方法はありません。

そのため、コードは、condvar でブロックされている最大 2 つのスレッドのブロックを解除します。数が少ない場合、追加の通知は効果がありません。

于 2013-02-26T09:32:49.983 に答える