An execution agent - это объект, такой как поток, который может выполнять работу параллельно с другими агентами выполнения. [ Note: Реализации или пользователи могут вводить другие виды агентов, такие как процессы или задачи пула потоков. ] Вызывающий агент определяется контекстом, например вызывающим потоком, который содержит вызов, и так далее. — end note
[ Note: Некоторые блокируемые объекты «не замечают агента» в том смысле, что они работают для любой модели исполняющего агента, потому что они не определяют и не хранят идентификатор агента (например, обычная блокировка спина). ] — end note
Стандартные шаблоны библиотеки unique_lock ([thread.lock.unique]), shared_lock ([thread.lock.shared]), scoped_lock ([thread.lock.scoped]), lock_guard ([thread.lock.guard]) lock,, try_lock ([thread.lock.algorithm]) и condition_variable_any ([thread.condition.condvarany]) работают с блокируемыми объектами, предоставляемыми пользователем. В BasicLockable требованиях, Lockable требованиях и TimedLockable требованиях перечислены требования, налагаемые этими типами библиотек, чтобы получить или освободить право собственности на объект lock для данного агента выполнения. [ Note: Характер владения блокировкой и любая синхронизация, которую она может повлечь за собой, не являются частью этих требований. ] — end note
Тип L соответствует BasicLockable требованиям, если следующие выражения правильно сформированы и имеют указанную семантику (m обозначает значение типа L).
m.lock()
Effects: Блокируется до тех пор, пока для текущего агента выполнения не будет получена блокировка. Если выбрасывается исключение, то для текущего агента выполнения блокировка не должна быть получена.
m.unlock()
Тип L соответствует Lockable требованиям, если он соответствует BasicLockable требованиям, а следующие выражения правильно сформированы и имеют указанную семантику (m обозначает значение типа L).
m.try_lock()
Effects: Пытается получить блокировку для текущего агента выполнения без блокировки. Если выбрасывается исключение, то для текущего агента выполнения блокировка не должна быть получена.
Тип L соответствует TimedLockable требованиям, если он соответствует Lockable требованиям, а следующие выражения правильно сформированы и имеют указанную семантику (m обозначает значение типа L, rel_time обозначает значение экземпляра durationи abs_time обозначает значение экземпляра time_point).
m.try_lock_for(rel_time)
Effects: Пытается получить блокировку для текущего агента выполнения в течение относительного таймаута ([thread.req.timing]), указанного в rel_time. Функция не должна возвращаться в течение тайм-аута, указанного в, rel_time если она не получила блокировку m для текущего агента выполнения. Если выбрасывается исключение, то для текущего агента выполнения блокировка не должна быть получена.
m.try_lock_until(abs_time)
Effects: Пытается получить блокировку для текущего агента выполнения до абсолютного тайм-аута ([thread.req.timing]), указанного в abs_time. Функция не должна возвращаться до истечения тайм-аута, указанного в, abs_time если только она не получила блокировку m для текущего агента выполнения. Если выбрасывается исключение, то для текущего агента выполнения блокировка не должна быть получена.