C++ named requirements: SharedMutex (since C++17)
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Требования SharedMutex расширяют Mutex требования, включая режим разделяемой блокировки.
Требования
Кроме того, объект
m
типа
SharedMutex
поддерживает другой режим владения: разделяемый. Несколько потоков (или, в более общем смысле, агентов выполнения) могут одновременно владеть этим мьютексом в разделяемом режиме, но ни один поток не может получить разделяемое владение, если есть поток, владеющий им в эксклюзивном режиме, и ни один поток не может получить эксклюзивное владение, если есть поток, владеющий им в разделяемом режиме. Если более чем определённое реализацией количество потоков (не менее 10000) удерживают разделяемую блокировку, следующая попытка захватить мьютекс в разделяемом режиме блокируется до тех пор, пока количество разделяемых владельцев не снизится ниже этого порога.
- Выражение m. lock_shared ( ) обладает следующими свойствами:
-
- Выполняется как атомарная операция.
- Блокирует вызывающий поток до тех пор, пока не будет получено совместное владение мьютексом.
- Предыдущие операции m. unlock ( ) на том же мьютексе синхронизируются-с данной операцией блокировки (эквивалентно release-acquire std::memory_order ).
- Поведение не определено, если вызывающий поток уже владеет мьютексом в любом режиме.
- Если возникает исключение, совместная блокировка не приобретается.
- Выражение m. try_lock_shared ( ) обладает следующими свойствами:
-
- Выполняется как атомарная операция.
- Пытается получить разделяемое владение мьютексом для вызывающего потока без блокировки. Если владение не получено, возвращает управление немедленно. Функция может спорадически завершаться неудачей и возвращать управление, даже если мьютекс в настоящее время не принадлежит никаким потокам в любом режиме.
-
Если
try_lock_shared()выполняется успешно, предыдущие операцииunlock()на том же объекте синхронизируются-с этой операцией (эквивалентно release-acquire std::memory_order ). - Поведение не определено, если вызывающий поток уже владеет мьютексом в любом режиме.
- Выражение m. unlock_shared ( ) обладает следующими свойствами:
-
- Ведёт себя как атомарная операция.
- Освобождает владение мьютексом вызывающим потоком и синхронизируется-с последующими успешными операциями захвата на том же объекте.
- Поведение не определено, если вызывающий поток не владеет мьютексом.
- Все операции блокировки и разблокировки одного мьютекса происходят в едином полном порядке.
Стандартная библиотека
Следующие стандартные библиотечные типы удовлетворяют SharedMutex требованиям:
|
(C++17)
|
предоставляет механизм совместного взаимного исключения
(класс) |
|
(C++14)
|
предоставляет механизм совместного взаимного исключения и реализует блокировку с таймаутом
(класс) |