Требования к именованным типам C++: Mutex (с C++11)
Требования к типу Mutex расширяют требования к Lockable с учётом межпотоковой синхронизации.
Требования
- Lockable
- DefaultConstructible
- Destructible
- не копируемый
- не перемещаемый
Для объекта типа Mutex m:
- Выражение
m.lock()имеет следующие свойства - Ведёт себя как атомарная операция.
- Блокирует вызывающий поток, пока не будет получено исключительное владение мьютексом.
- Предыдущие
m.unlock()операции над тем же мьютексом синхронизируются с этой операцией блокировки (эквивалентно release-acquirestd::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-acquirestd::memory_order).lock()не синхронизируется с неудачной операциейtry_lock(). - Не выбрасывает исключений.
- Выражение
m.unlock()имеет следующие свойства - Ведёт себя как атомарная операция.
- Освобождает владение мьютексом вызывающим потоком и синхронизируется со следующими успешными операциями блокировки над тем же объектом.
- Поведение не определено, если вызывающий поток не владеет мьютексом.
- Не выбрасывает исключений.
- Все операции блокировки и разблокировки одного мьютекса происходят в едином общем порядке, который можно рассматривать как порядок изменения атомной переменной: порядок специфичен для данного мьютекса.
Типы библиотек
Следующие типы стандартной библиотеки удовлетворяют требованиям к Mutex:
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам 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/w/cpp/named_req/Mutex