Czy muszę synchronizować std :: condition_variable / condition_variable_any :: notify_one

Czy muszę synchronizowaćstd::condition_variable/condition_variable_any::notify_one?

O ile widzę, jeśli utrata powiadomień jest akceptowalna - można zadzwonićnotify_one nie jest chroniony (na przykład przez mutex).

Na przykład widziałem następujące wzorce użytkowania (przepraszam, nie pamiętam gdzie):

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

Ale sprawdziłem źródła libstdc ++ i widzę:

condition_variable :: 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);
}

icondition_variable_any :: notify_one:

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

A oto układ condition_variable_any:

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

To znaczy. jest to po prostu cienkie opakowanie wokół zmiennej warunkowej + mutex.

Tak więc pytania:

Czy nie można bezpiecznie chronić nicinotify_one przez mutex dla obucondition_variable_any lubcondition_variable?Dlaczego implementacja condition_variable_any używa dodatkowego muteksu?Dlaczego realizacjacondition_variable_any::notify_one icondition_variable::notify_one różni się? Możecondition_variable::notify_one wymaga ręcznej ochrony, alecondition_variable_any::notify_one nie? Czy jest to błąd libstdc ++?

questionAnswers(2)

yourAnswerToTheQuestion