От C++ 14 главе "30.4.1.2 типы Mutex"
пункт 16:
Реализация может не получить блокировку, даже если он не принадлежит какой-либо другой поток. [Примечание. Этот ложный сбой обычно необычен, но позволяет интересные реализации на основе простого сравнения и обмена (статья 29). -end note] Реализация должна гарантировать, что try_lock()
не будет последовательно возвращать false
в отсутствие конкурирующих приобретений мьютексов.
и пункт 19:
мало что известно о состоянии после сбоя, даже при отсутствии ложных отказов
И в ответ на
Я знаю, что поддельное пробуждение может произойти с std :: condition_variable и его обоснованием. Но что происходит с мьютексом?
std::timed_mutex
иногда реализуется с использованием std::condition_varible
, когда в ОС нет прямой поддержки. Как и в 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