¿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 ++?