Da C++ 14 capitolo "30.4.1.2 tipi mutex"
paragrafo 16:
Un'implementazione potrebbe non riuscire a ottenere il blocco, anche se non è detenuto da qualsiasi altro thread. [Nota: questo errore spuria è normalmente raro, ma consente implementazioni interessanti basate su un semplice confronto e scambio (clausola 29). -end note] Un'implementazione dovrebbe garantire che try_lock()
non restituisca in modo coerente false
in assenza di acquisizioni di mutex in conflitto.
e il paragrafo 19:
poco sarebbe stato conosciuto circa lo stato dopo un guasto, anche in assenza di guasti spuri
E in risposta a
So che può accadere che la sveglia spuria avvenga con std :: condition_variable e la logica dietro di esso. Ma, che succede con un mutex?
std::timed_mutex
a volte viene implementato utilizzando std::condition_varible
quando non esiste un supporto diretto nel sistema operativo. Come in GNU libstdC++:
#if _GTHREAD_USE_MUTEX_TIMEDLOCK
...
#else // !_GTHREAD_USE_MUTEX_TIMEDLOCK
class timed_mutex
{
mutex _M_mut;
condition_variable _M_cv;
bool _M_locked = false;
public:
template<typename _Rep, typename _Period>
bool
try_lock_for(const chrono::duration<_Rep, _Period>& __rtime)
{
unique_lock<mutex> __lk(_M_mut);
if (!_M_cv.wait_for(__lk, __rtime, [&]{ return !_M_locked; }))
return false;
_M_locked = true;
return true;
}
template<typename _Clock, typename _Duration>
bool
try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime)
{
unique_lock<mutex> __lk(_M_mut);
if (!_M_cv.wait_until(__lk, __atime, [&]{ return !_M_locked; }))
return false;
_M_locked = true;
return true;
}
};
#endif
fonte
2015-11-25 11:36:57