¿Necesito sincronizar std :: condition_variable / condition_variable_any :: notify_one

Necesito sincronizarstd::condition_variable/condition_variable_any::notify_one?

Por lo que puedo ver, si la pérdida de notificaciones es aceptable, está bien llamarnotify_one no protegido (por mutex por ejemplo).

Por ejemplo, vi los siguientes patrones de uso (lo siento, no recuerdo dónde):

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

Pero, he inspeccionado las fuentes libstdc ++, y veo:

condición_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);
}

ycondition_variable_any :: notify_one:

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

Y aquí está el diseño de condition_variable_any:

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

Es decir. es solo una envoltura delgada alrededor de condition_variable + mutex.

Entonces, preguntas:

¿Es seguro para los hilos no proteger?notify_one por mutex para cualquieracondition_variable_any ocondition_variable?¿Por qué la implementación de condition_variable_any usa mutex adicional?¿Por qué la implementación decondition_variable_any::notify_one ycondition_variable::notify_one difiere? Tal vezcondition_variable::notify_one requiere protección manual perocondition_variable_any::notify_one no? ¿Es el error libstdc ++?

Respuestas a la pregunta(2)

Su respuesta a la pregunta