Spec-Zone.ru › C++

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

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

Требования

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

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

  • Выражение m.lock() обладает следующими свойствами
  • Выполняется как атомарная операция.
  • Блокирует вызывающий поток до тех пор, пока не станет возможно получить монопольное владение мьютексом.
  • Предшествующие операции m.unlock() над тем же мьютексом синхронизируются-с этой операцией блокировки (эквивалентно std::memory_order с семантикой release-acquire).
  • Поведение не определено, если вызывающий поток уже владеет мьютексом (кроме случаев, когда 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() над тем же объектом синхронизируются-с этой операцией (эквивалентно std::memory_order с семантикой release-acquire). lock() не синхронизируется с неудачным try_lock().
    • Не выбрасывает исключений.
  • Выражение m.unlock() обладает следующими свойствами
    • Выполняется как атомарная операция.
    • Освобождает мьютекс, принадлежащий вызывающему потоку, и синхронизируется-с последующими успешными операциями блокировки над тем же объектом.
    • Поведение не определено, если вызывающий поток не владеет мьютексом.
    • Не выбрасывает исключений.
  • Все операции блокировки и разблокировки одного мьютекса происходят в едином полном порядке, который можно рассматривать как порядок модификации атомарной переменной: этот порядок относится только к данному мьютексу.

Стандартная библиотека

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

mutex
(C++11)
предоставляет базовые средства взаимного исключения
(класс)
recursive_mutex
(C++11)
предоставляет средства взаимного исключения, которые один и тот же поток может блокировать рекурсивно
(класс)
recursive_timed_mutex
(C++11)
предоставляет средства взаимного исключения, которые один и тот же поток может блокировать рекурсивно,
а также реализует блокировку с тайм-аутом
(класс)
shared_mutex
(C++17)
предоставляет средства совместного взаимного исключения
(класс)
shared_timed_mutex
(C++14)
предоставляет средства совместного взаимного исключения и реализует блокировку с тайм-аутом
(класс)
timed_mutex
(C++11)
предоставляет средства взаимного исключения и реализует блокировку с тайм-аутом
(класс)

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

Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам 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/cpp/named_req/Mutex

Spec-Zone.ru

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