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