Именованные требования C++: SharedMutex (начиная с C++17)
Требования SharedMutex расширяют требования Mutex, включая режим совместного владения блокировкой.
Требования
Кроме того, объект типа SharedMutex m поддерживает еще один режим владения: совместный. Несколько потоков (или, в более общем случае, агентов выполнения) могут одновременно владеть этим мьютексом в совместном режиме, однако ни один поток не может получить совместное владение, если мьютексом владеет поток в эксклюзивном режиме, и ни один поток не может получить эксклюзивное владение, если мьютексом владеет поток в совместном режиме. Если совместную блокировку удерживает большее число потоков, чем задано реализацией (не менее 10000), следующая попытка получить мьютекс в совместном режиме блокируется, пока число владельцев совместной блокировки не опустится ниже этого порога.
- Выражение
m.lock_shared()обладает следующими свойствами: - Выполняется как атомарная операция.
- Блокирует вызывающий поток до тех пор, пока не станет возможным получить совместное владение мьютексом.
- Предшествующие операции
m.unlock()над тем же мьютексом синхронизируются с этой операцией блокировки (эквивалентноstd::memory_orderс семантикой release-acquire). - Поведение не определено, если вызывающий поток уже владеет мьютексом в каком-либо режиме.
- Если выбрасывается исключение, совместная блокировка не захватывается.
- Выражение
m.try_lock_shared()обладает следующими свойствами: - Выполняется как атомарная операция.
- Пытается получить совместное владение мьютексом для вызывающего потока без блокировки. Если владение не получено, функция немедленно возвращает управление. Функция может без причины завершиться неудачей и вернуть управление, даже если в данный момент ни один поток не владеет мьютексом ни в каком режиме.
- Если
try_lock_shared()завершается успешно, предшествующие операцииunlock()над тем же объектом синхронизируются с этой операцией (эквивалентноstd::memory_orderс семантикой release-acquire). - Поведение не определено, если вызывающий поток уже владеет мьютексом в каком-либо режиме.
- Выражение
m.unlock_shared()обладает следующими свойствами: - Выполняется как атомарная операция.
- Освобождает владение мьютексом вызывающим потоком и синхронизируется с последующими успешными операциями блокировки над тем же объектом.
- Поведение не определено, если вызывающий поток не владеет мьютексом.
- Все операции блокировки и разблокировки над одним мьютексом происходят в едином полном порядке.
Стандартная библиотека
Следующие типы стандартной библиотеки удовлетворяют требованиям SharedMutex:
|
(C++17) | обеспечивает взаимное исключение с совместным доступом (класс) |
|
(C++14) | обеспечивает взаимное исключение с совместным доступом и поддерживает блокировку с тайм-аутом (класс) |
См. также
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/SharedMutex