C++ named requirements: Mutex (since C++11)
From cppreference.net
Требования Mutex расширяют Lockable требования, включая межпоточную синхронизацию.
Содержание |
Требования
- Lockable
- DefaultConstructible
- Destructible
- не копируемый
- не перемещаемый
Для объекта
m
типа
Mutex
:
- Выражение m. lock ( ) обладает следующими свойствами
-
- Выполняется как атомарная операция.
- Блокирует вызывающий поток до тех пор, пока не будет получено эксклюзивное владение мьютексом.
- Предыдущие операции m. unlock ( ) на том же мьютексе синхронизируются-с данной операцией блокировки (эквивалентно release-acquire std::memory_order ).
- Поведение не определено, если вызывающий поток уже владеет мьютексом (за исключением случаев, когда m является std::recursive_mutex или std::recursive_timed_mutex ).
- Могут быть выброшены исключения типа std::system_error при ошибках, со следующими кодами ошибок:
-
- std::errc::operation_not_permitted если вызывающий поток не имеет необходимых привилегий.
- std::errc::resource_deadlock_would_occur если реализация обнаруживает, что данная операция приведет к взаимной блокировке.
- Выражение m. try_lock ( ) обладает следующими свойствами
-
- Выполняется как атомарная операция.
- Пытается получить эксклюзивное владение мьютексом для вызывающего потока без блокировки. Если владение не получено, возвращается немедленно. Функция может спорадически завершаться неудачей и возвращать управление, даже если мьютекс в данный момент не принадлежит другому потоку.
-
Если
try_lock()завершается успешно, предыдущие операцииunlock()на том же объекте синхронизируются с этой операцией (эквивалентно release-acquire std::memory_order ).lock()не синхронизируется с неудачным вызовомtry_lock(). - Не генерирует исключений.
- Выражение m. unlock ( ) обладает следующими свойствами
-
- Ведёт себя как атомарная операция.
- Освобождает владение мьютексом вызывающим потоком и синхронизируется-с последующими успешными операциями захвата на том же объекте.
- Поведение не определено, если вызывающий поток не владеет мьютексом.
- Не генерирует исключения.
- Все операции блокировки и разблокировки одного мьютекса происходят в едином полном порядке, который можно рассматривать как порядок модификации атомарной переменной: этот порядок специфичен для данного конкретного мьютекса.
Стандартная библиотека
Следующие типы стандартной библиотеки удовлетворяют Mutex требованиям:
|
(C++11)
|
предоставляет базовое средство взаимного исключения
(class) |
|
(C++11)
|
предоставляет средство взаимного исключения, которое может быть рекурсивно заблокировано тем же потоком
(class) |
|
(C++11)
|
предоставляет средство взаимного исключения, которое может быть рекурсивно заблокировано
тем же потоком и реализует блокировку с таймаутом (class) |
|
(C++17)
|
предоставляет средство разделяемого взаимного исключения
(class) |
|
(C++14)
|
предоставляет средство разделяемого взаимного исключения и реализует блокировку с таймаутом
(class) |
|
(C++11)
|
предоставляет средство взаимного исключения, которое реализует блокировку с таймаутом
(class) |
Отчеты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2309 | C++11 |
lock
может выбрасывать
std::system_error
с кодом ошибки std::errc::device_or_resource_busy |
не допускается |