Нужно ли синхронизировать std :: condition_variable / condition_variable_any :: notify_one

Нужно ли синхронизировать?std::condition_variable/condition_variable_any::notify_one

Насколько я вижу, если потеря уведомлений приемлема - это нормально, чтобы позвонитьnotify_one не защищен (например, мьютексом).

Например, я видел следующие шаблоны использования (извините, нене помню где)

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

Но я проверил источники libstdc ++ и вижу:

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

а такжеcondition_variable_any :: notify_one:

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

А вот макет condition_variable_any:

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

То есть это просто тонкая оболочка вокруг condition_variable + mutex.

Итак, вопросы:

Это потокобезопасный, чтобы не защищатьnotify_one мьютексом либоcondition_variable_any или же ?condition_variableПочему реализация condition_variable_any использует дополнительный мьютекс?Почему реализацияcondition_variable_any::notify_one а такжеcondition_variable::notify_one отличается? Может бытьcondition_variable::notify_one требует ручной защиты, ноcondition_variable_any::notify_one Безразлично»т? Это ошибка libstdc ++?

Ответы на вопрос(2)

Ваш ответ на вопрос