Именованные требования C++: TimedMutex (начиная с C++11)
Требования 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()над тем же объектом синхронизируются-с этой операцией (эквивалентноstd::memory_orderrelease-acquire). - Поведение не определено, если вызывающий поток уже владеет мьютексом (за исключением случая, когда m —
std::recursive_timed_mutex). - Во время выполнения clock, time point или duration могут выбросить исключение (clock, time point и duration, предоставляемые стандартной библиотекой, никогда не выбрасывают исключений).
- Выражение
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()над тем же объектом синхронизируются-с этой операцией (эквивалентноstd::memory_orderrelease-acquire). - Поведение не определено, если вызывающий поток уже владеет мьютексом (за исключением случая, когда m —
std::recursive_timed_mutex). - Во время выполнения clock, time point или duration могут выбросить исключение (clock, time point и duration, предоставляемые стандартной библиотекой, никогда не выбрасывают исключений).
Стандартная библиотека
Следующие типы стандартной библиотеки соответствуют требованиям TimedMutex:
|
(C++11) | предоставляет средство взаимного исключения, которое может рекурсивно блокироваться одним и тем же потоком и реализует блокировку с тайм-аутом (класс) |
|
(C++14) | предоставляет средство совместного взаимного исключения и реализует блокировку с тайм-аутом (класс) |
|
(C++11) | предоставляет средство взаимного исключения, реализующее блокировку с тайм-аутом (класс) |
Отчёты об исправлениях дефектов
Следующие отчёты об исправлениях дефектов, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение согласно опубликованной спецификации | Правильное поведение |
|---|---|---|---|
| LWG 2093 | C++11 | исключения, связанные с тайм-аутом, отсутствовали в спецификации | указаны |
См. также
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/TimedMutex