Muss ich std :: condition_variable / condition_variable_any :: notify_one synchronisieren?

Muss ich synchronisieren?std::condition_variable/condition_variable_any::notify_one?

Soweit ich sehen kann, ist es in Ordnung anzurufen, wenn der Verlust von Benachrichtigungen akzeptabel istnotify_one nicht geschützt (zum Beispiel durch Mutex).

Zum Beispiel sah ich folgende Verwendungsmuster (sorry, weiß nicht mehr wo):

{
    {
        lock_guard<mutex> l(m);
        // do work
    }
    c.notify_one();
}

Aber ich habe libstdc ++ - Quellen überprüft und sehe:

bedingungsvariable :: notify_one

void condition_variable::notify_one() noexcept
{
    int __e = __gthread_cond_signal(&_M_cond);
    // XXX not in spec
    // EINVAL
    if (__e)
        __throw_system_error(__e);
}

undcondition_variable_any :: notify_one:

void condition_variable_any::notify_one() noexcept
{
    lock_guard<mutex> __lock(_M_mutex);
    _M_cond.notify_one();
}

Und hier ist das Layout von condition_variable_any:

class condition_variable_any
{
    condition_variable _M_cond;
    mutex _M_mutex;
    // data end

Das heißt Es ist nur ein dünner Wrapper um condition_variable + mutex.

Also, Fragen:

Ist es threadsicher, nicht zu schützen?notify_one durch Mutex für entwedercondition_variable_any odercondition_variable?Warum verwendet die Implementierung von condition_variable_any zusätzlichen Mutex?Warum Implementierung voncondition_variable_any::notify_one undcondition_variable::notify_one unterscheidet sich? Könnte seincondition_variable::notify_one erfordert aber einen manuellen schutzcondition_variable_any::notify_one nicht? Ist es ein libstdc ++ Fehler?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage