Muss ich std :: condition_variable / condition_variable_any :: notify_one synchronisieren?
Muss ich synchronisieren?std::condition_variable/condition_variable_any::notify_one
?
Soweit ich sehen kann, ist es in Ordnung anzurufen, wenn der Verlust von Benachrichtigungen akzeptabel istnotify_one
nicht geschützt (zum Beispiel durch Mutex).
Zum Beispiel sah ich folgende Verwendungsmuster (sorry, weiß nicht mehr wo):
{
{
lock_guard<mutex> l(m);
// do work
}
c.notify_one();
}
Aber ich habe libstdc ++ - Quellen überprüft und sehe:
bedingungsvariable :: 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);
}
undcondition_variable_any :: notify_one:
void condition_variable_any::notify_one() noexcept
{
lock_guard<mutex> __lock(_M_mutex);
_M_cond.notify_one();
}
Und hier ist das Layout von condition_variable_any:
class condition_variable_any
{
condition_variable _M_cond;
mutex _M_mutex;
// data end
Das heißt Es ist nur ein dünner Wrapper um condition_variable + mutex.
Also, Fragen:
Ist es threadsicher, nicht zu schützen?notify_one
durch Mutex für entwedercondition_variable_any
odercondition_variable
?Warum verwendet die Implementierung von condition_variable_any zusätzlichen Mutex?Warum Implementierung voncondition_variable_any::notify_one
undcondition_variable::notify_one
unterscheidet sich? Könnte seincondition_variable::notify_one
erfordert aber einen manuellen schutzcondition_variable_any::notify_one
nicht? Ist es ein libstdc ++ Fehler?