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