Czy muszę synchronizować std :: condition_variable / condition_variable_any :: notify_one
Czy muszę synchronizowaćstd::condition_variable/condition_variable_any::notify_one
?
O ile widzę, jeśli utrata powiadomień jest akceptowalna - można zadzwonićnotify_one
nie jest chroniony (na przykład przez mutex).
Na przykład widziałem następujące wzorce użytkowania (przepraszam, nie pamiętam gdzie):
{
{
lock_guard<mutex> l(m);
// do work
}
c.notify_one();
}
Ale sprawdziłem źródła libstdc ++ i widzę:
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);
}
icondition_variable_any :: notify_one:
void condition_variable_any::notify_one() noexcept
{
lock_guard<mutex> __lock(_M_mutex);
_M_cond.notify_one();
}
A oto układ condition_variable_any:
class condition_variable_any
{
condition_variable _M_cond;
mutex _M_mutex;
// data end
To znaczy. jest to po prostu cienkie opakowanie wokół zmiennej warunkowej + mutex.
Tak więc pytania:
Czy nie można bezpiecznie chronić nicinotify_one
przez mutex dla obucondition_variable_any
lubcondition_variable
?Dlaczego implementacja condition_variable_any używa dodatkowego muteksu?Dlaczego realizacjacondition_variable_any::notify_one
icondition_variable::notify_one
różni się? Możecondition_variable::notify_one
wymaga ręcznej ochrony, alecondition_variable_any::notify_one
nie? Czy jest to błąd libstdc ++?