Namespaces
Variants

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

From cppreference.net
C++ named requirements

Требования Mutex расширяют Lockable требования, включая межпоточную синхронизацию.

Содержание

Требования

Для объекта m типа Mutex :

  • Выражение m. lock ( ) обладает следующими свойствами
  • Выполняется как атомарная операция.
  • Блокирует вызывающий поток до тех пор, пока не будет получено эксклюзивное владение мьютексом.
  • Предыдущие операции m. unlock ( ) на том же мьютексе синхронизируются-с данной операцией блокировки (эквивалентно release-acquire std::memory_order ).
  • Поведение не определено, если вызывающий поток уже владеет мьютексом (за исключением случаев, когда m является std::recursive_mutex или std::recursive_timed_mutex ).
  • Могут быть выброшены исключения типа std::system_error при ошибках, со следующими кодами ошибок:
  • Выражение m. try_lock ( ) обладает следующими свойствами
  • Выполняется как атомарная операция.
  • Пытается получить эксклюзивное владение мьютексом для вызывающего потока без блокировки. Если владение не получено, возвращается немедленно. Функция может спорадически завершаться неудачей и возвращать управление, даже если мьютекс в данный момент не принадлежит другому потоку.
  • Если try_lock() завершается успешно, предыдущие операции unlock() на том же объекте синхронизируются с этой операцией (эквивалентно release-acquire std::memory_order ). lock() не синхронизируется с неудачным вызовом try_lock() .
  • Не генерирует исключений.
  • Выражение m. unlock ( ) обладает следующими свойствами
  • Ведёт себя как атомарная операция.
  • Освобождает владение мьютексом вызывающим потоком и синхронизируется-с последующими успешными операциями захвата на том же объекте.
  • Поведение не определено, если вызывающий поток не владеет мьютексом.
  • Не генерирует исключения.
  • Все операции блокировки и разблокировки одного мьютекса происходят в едином полном порядке, который можно рассматривать как порядок модификации атомарной переменной: этот порядок специфичен для данного конкретного мьютекса.

Стандартная библиотека

Следующие типы стандартной библиотеки удовлетворяют Mutex требованиям:

(C++11)
предоставляет базовое средство взаимного исключения
(class)
предоставляет средство взаимного исключения, которое может быть рекурсивно заблокировано тем же потоком
(class)
предоставляет средство взаимного исключения, которое может быть рекурсивно заблокировано
тем же потоком и реализует блокировку с таймаутом
(class)
предоставляет средство разделяемого взаимного исключения
(class)
предоставляет средство разделяемого взаимного исключения и реализует блокировку с таймаутом
(class)
предоставляет средство взаимного исключения, которое реализует блокировку с таймаутом
(class)

Отчеты о дефектах

Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2309 C++11 lock может выбрасывать std::system_error
с кодом ошибки std::errc::device_or_resource_busy
не допускается

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