Нужно ли синхронизировать std::condition_variable/condition_variable_any::notify_one
?
Насколько я могу судить, если потеряны уведомления допустимы - нормально позвонить notify_one
не защищен (например, mutex).
Например, я видел следующие шаблоны использования (извините, не помню где):
{
{
lock_guard<mutex> l(m);
// do work
}
c.notify_one();
}
Но я проверял источники libstdС++, и я вижу:
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<mutex> __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
отключать mutex для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
нет? Это libstdС++ ошибка?