Именованные требования C++: Mutex (начиная с C++11)
Требования Mutex расширяют требования Lockable, добавляя синхронизацию между потоками.
Требования
- Lockable
- DefaultConstructible
- Destructible
- не копируемый
- не перемещаемый
Для объекта m типа Mutex:
- Выражение
m.lock()обладает следующими свойствами - Выполняется как атомарная операция.
- Блокирует вызывающий поток до тех пор, пока не станет возможно получить монопольное владение мьютексом.
- Предшествующие операции
m.unlock()над тем же мьютексом синхронизируются-с этой операцией блокировки (эквивалентноstd::memory_orderс семантикой release-acquire). - Поведение не определено, если вызывающий поток уже владеет мьютексом (кроме случаев, когда 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()над тем же объектом синхронизируются-с этой операцией (эквивалентноstd::memory_orderс семантикой release-acquire).lock()не синхронизируется с неудачнымtry_lock(). - Не выбрасывает исключений.
- Выражение
m.unlock()обладает следующими свойствами - Выполняется как атомарная операция.
- Освобождает мьютекс, принадлежащий вызывающему потоку, и синхронизируется-с последующими успешными операциями блокировки над тем же объектом.
- Поведение не определено, если вызывающий поток не владеет мьютексом.
- Не выбрасывает исключений.
- Все операции блокировки и разблокировки одного мьютекса происходят в едином полном порядке, который можно рассматривать как порядок модификации атомарной переменной: этот порядок относится только к данному мьютексу.
Стандартная библиотека
Следующие типы стандартной библиотеки удовлетворяют требованиям Mutex:
|
(C++11) | предоставляет базовые средства взаимного исключения (класс) |
|
(C++11) | предоставляет средства взаимного исключения, которые один и тот же поток может блокировать рекурсивно (класс) |
|
(C++11) | предоставляет средства взаимного исключения, которые один и тот же поток может блокировать рекурсивно, а также реализует блокировку с тайм-аутом (класс) |
|
(C++17) | предоставляет средства совместного взаимного исключения (класс) |
|
(C++14) | предоставляет средства совместного взаимного исключения и реализует блокировку с тайм-аутом (класс) |
|
(C++11) | предоставляет средства взаимного исключения и реализует блокировку с тайм-аутом (класс) |
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 2309 | C++11 |
lock может выбросить std::system_errorс кодом ошибки std::errc::device_or_resource_busy | не допускается |
См. также
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/Mutex