Нужно ли синхронизировать 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 ++?