Spec-Zone.ru › C++

Именованные требования C++: SharedMutex (начиная с C++17)

Требования SharedMutex расширяют требования Mutex, включая режим совместного владения блокировкой.

Требования

  • 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:

shared_mutex
(C++17)
обеспечивает взаимное исключение с совместным доступом
(класс)
shared_timed_mutex
(C++14)
обеспечивает взаимное исключение с совместным доступом и поддерживает блокировку с тайм-аутом
(класс)

См. также

  • Библиотека поддержки потоков
  • Mutex
  • TimedMutex
  • SharedTimedMutex

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/SharedMutex

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API