C++ named requirements: TimedMutex (since C++11)
From cppreference.net
Требования TimedMutex расширяют требования TimedLockable включением межпоточной синхронизации.
Содержание |
Требования
Кроме того, для объекта
m
типа
TimedMutex
:
- Выражение m. try_lock_for ( duration ) обладает следующими свойствами
-
- Выполняется как атомарная операция.
-
Пытается получить эксклюзивное владение мьютексом в течение времени, указанного в
duration. Еслиdurationменьше или равноduration.zero(), пытается получить владение без блокировки (как при вызовеtry_lock()). В противном случае эта функция блокируется до тех пор, пока мьютекс не будет захвачен или не истечет время, указанное вduration. Она возвращает управление в течениеdurationтолько в случае успеха, но может не захватить мьютекс даже если в какой-то момент времени в течениеdurationон не принадлежал другому потоку. В любом случае возвращает true если мьютекс был захвачен и false в противном случае. -
Если
try_lock_for(duration)завершается успешно, предыдущие операцииunlock()на том же объекте синхронизируются-с этой операцией (эквивалентно release-acquire std::memory_order ). - Поведение не определено, если вызывающий поток уже владеет мьютексом (за исключением случая, когда m является std::recursive_timed_mutex ).
- В процессе выполнения могут быть выброшены исключения часами, точкой времени или длительностью (часы, точки времени и длительности, предоставляемые стандартной библиотекой, никогда не генерируют исключений).
- Выражение m. try_lock_until ( time_point ) обладает следующими свойствами
-
- Выполняется как атомарная операция.
-
Пытается получить эксклюзивное владение мьютексом в течение оставшегося времени до
time_point. Еслиtime_pointуже прошёл, пытается получить владение без блокировки (как при вызовеtry_lock()). В противном случае эта функция блокируется до тех пор, пока мьютекс не будет захвачен или пока не будет достигнуто время, указанное вtime_point. Она возвращает управление доtime_pointтолько в случае успеха, но может не захватить мьютекс даже если в какой-то момент времени доtime_pointон не принадлежал другому потоку. В любом случае возвращает true если мьютекс был захвачен и false в противном случае. -
Если
try_lock_until(time_point)завершается успешно, предыдущие операцииunlock()на том же объекте синхронизируются-с этой операцией (эквивалентно release-acquire std::memory_order ). - Поведение не определено, если вызывающий поток уже владеет мьютексом (за исключением случая, когда m является std::recursive_timed_mutex ).
- В процессе выполнения могут быть выброшены исключения часами, точкой времени или длительностью (часы, точки времени и длительности, предоставляемые стандартной библиотекой, никогда не генерируют исключений).
Стандартная библиотека
Следующие типы стандартной библиотеки удовлетворяют TimedMutex требованиям:
|
(C++11)
|
предоставляет механизм взаимного исключения, который может быть рекурсивно заблокирован
одним и тем же потоком и реализует блокировку с таймаутом (класс) |
|
(C++14)
|
предоставляет механизм разделяемого взаимного исключения и реализует блокировку с таймаутом
(класс) |
|
(C++11)
|
предоставляет механизм взаимного исключения, который реализует блокировку с таймаутом
(класс) |
Отчеты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2093 | C++11 | исключения, связанные с таймаутом, отсутствовали в спецификации | упомянуты |