Namespaces
Variants

C++ named requirements: TimedMutex (since C++11)

From cppreference.net
C++ named requirements

Требования 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++.

DR Applied to Behavior as published Correct behavior
LWG 2093 C++11 исключения, связанные с таймаутом, отсутствовали в спецификации упомянуты

Смотрите также