Spec-Zone.ru › C++

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

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

Требования

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

  • std::shared_mutex(с C++17)
  • std::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/w/cpp/named_req/SharedMutex

Spec-Zone.ru

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