Spec-Zone.ru › C++

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

Требования к типу Mutex расширяют требования к Lockable с учётом межпотоковой синхронизации.

Требования

  • Lockable
  • DefaultConstructible
  • Destructible
  • не копируемый
  • не перемещаемый

Для объекта типа Mutex m:

  • Выражение m.lock() имеет следующие свойства
  • Ведёт себя как атомарная операция.
  • Блокирует вызывающий поток, пока не будет получено исключительное владение мьютексом.
  • Предыдущие m.unlock() операции над тем же мьютексом синхронизируются с этой операцией блокировки (эквивалентно release-acquire std::memory_order).
  • Поведение не определено, если вызывающий поток уже владеет мьютексом (за исключением случаев, когда m является std::recursive_mutex или std::recursive_timed_mutex).
  • Исключение типа std::system_error может быть выброшено при ошибках, с кодами ошибок:
    • std::errc::operation_not_permitted, если у вызывающего потока нет необходимых привилегий.
    • std::errc::resource_deadlock_would_occur, если реализация обнаруживает, что эта операция приведёт к тупику.
  • Выражение m.try_lock() имеет следующие свойства
    • Ведёт себя как атомарная операция.
    • Пытается получить исключительное владение мьютексом для вызывающего потока без блокировки. Если владение не получено, функция возвращается немедленно. Функция может случайным образом потерпеть неудачу и вернуть результат, даже если мьютекс не принадлежит другому потоку в данный момент.
    • Если try_lock() выполняется успешно, предыдущие unlock() операции над тем же объектом синхронизируются с этой операцией (эквивалентно release-acquire std::memory_order). lock() не синхронизируется с неудачной операцией try_lock().
    • Не выбрасывает исключений.
  • Выражение m.unlock() имеет следующие свойства
    • Ведёт себя как атомарная операция.
    • Освобождает владение мьютексом вызывающим потоком и синхронизируется со следующими успешными операциями блокировки над тем же объектом.
    • Поведение не определено, если вызывающий поток не владеет мьютексом.
    • Не выбрасывает исключений.
  • Все операции блокировки и разблокировки одного мьютекса происходят в едином общем порядке, который можно рассматривать как порядок изменения атомной переменной: порядок специфичен для данного мьютекса.

Типы библиотек

Следующие типы стандартной библиотеки удовлетворяют требованиям к Mutex:

  • std::mutex
  • std::recursive_mutex
  • std::timed_mutex
  • std::recursive_timed_mutex
  • std::shared_mutex

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применено к Поведение, как опубликовано Корректное поведение
LWG 2309 C++11 lock могло выбросить std::system_error
с кодом ошибки std::errc::device_or_resource_busy
не разрешено

См. также

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

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

Spec-Zone.ru

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