Namespaces
Variants

C++ named requirements: SharedMutex (since C++17)

From cppreference.net
C++ named requirements

Требования 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 требованиям:

предоставляет механизм совместного взаимного исключения
(класс)
предоставляет механизм совместного взаимного исключения и реализует блокировку с таймаутом
(класс)

Смотрите также