33 Thread support library [thread]

33.2 Requirements [thread.req]

33.2.5 Requirements for Lockable types [thread.req.lockable]

33.2.5.1 In general [thread.req.lockable.general]

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

33.2.5.2 BasicLockable requirements [thread.req.lockable.basic]

Тип L соответствует BasicLockable требованиям, если следующие выражения правильно сформированы и имеют указанную семантику (m обозначает значение типа L).

m.lock()

Effects: Блокируется до тех пор, пока для текущего агента выполнения не будет получена блокировка. Если выбрасывается исключение, то для текущего агента выполнения блокировка не должна быть получена.

m.unlock()

Requires: Текущий агент исполнения должен удерживать блокировку m.

Effects: Снимает блокировку, m удерживаемую текущим агентом выполнения.

Throws: Ничего такого.

33.2.5.3 Lockable requirements [thread.req.lockable.req]

Тип L соответствует Lockable требованиям, если он соответствует BasicLockable требованиям, а следующие выражения правильно сформированы и имеют указанную семантику (m обозначает значение типа L).

m.try_lock()

Effects: Пытается получить блокировку для текущего агента выполнения без блокировки. Если выбрасывается исключение, то для текущего агента выполнения блокировка не должна быть получена.

Return type: bool.

Returns: true если блокировка была приобретена, false иначе.

33.2.5.4 TimedLockable requirements [thread.req.lockable.timed]

Тип 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 для текущего агента выполнения. Если выбрасывается исключение, то для текущего агента выполнения блокировка не должна быть получена.

Return type: bool.

Returns: true если блокировка была приобретена, false иначе.

m.try_lock_until(abs_time)

Effects: Пытается получить блокировку для текущего агента выполнения до абсолютного тайм-аута ([thread.req.timing]), указанного в abs_­time. Функция не должна возвращаться до истечения тайм-аута, указанного в, abs_­time если только она не получила блокировку m для текущего агента выполнения. Если выбрасывается исключение, то для текущего агента выполнения блокировка не должна быть получена.

Return type: bool.

Returns: true если блокировка была приобретена, false иначе.