Поделиться через


Класс unique_lock

Представляет шаблон, для которого можно создать экземпляры и объекты, управляющие блокировкой и разблокировкой mutex.

Синтаксис

template <class Mutex>
class unique_lock;

Замечания

В аргументе шаблона Mutex должно быть указано имя типа мьютекс.

На внутреннем уровне unique_lock содержит указатель на связанный с ним объект mutex и bool, который указывает, владеет ли текущий поток mutex.

Участники

Общедоступные определения типов

Имя Описание
mutex_type Синоним для аргумента шаблона Mutex.

Открытые конструкторы

Имя Описание
unique_lock Формирует объект unique_lock.
Деструктор ~unique_lock Освобождает все ресурсы, связанные с объектом unique_lock.

Открытые методы

Имя Описание
lock Блокирует вызывающий поток до тех пор, пока этот поток не получит права владельца соответствующего объекта mutex.
mutex Извлекает сохраненный указатель на соответствующий объект mutex.
owns_lock Указывает, является ли вызывающий поток владельцем соответствующего объекта mutex.
release Отменяет связь объекта unique_lock с объектом mutex.
swap Меняет местами соответствующий mutex и статус владения с аналогичными свойствами указанного объекта.
try_lock Попытки получить права владельца связанного объекта mutex без блокировки.
try_lock_for Попытки получить права владельца связанного объекта mutex без блокировки.
try_lock_until Попытки получить права владельца связанного объекта mutex без блокировки.
unlock Освобождает права владения для соответствующего объекта mutex.

Открытые операторы

Имя Описание
operator bool Указывает, является ли вызывающий поток владельцем соответствующего объекта mutex.
operator= Копирует сохраненный указатель mutex и соответствующее состояние владения из указанного объекта.

Иерархия наследования

unique_lock

Требования

Заголовок:<mutex>

Пространство имен: std

lock

Блокирует вызывающий поток до тех пор, пока этот поток не получит права владельца соответствующего объекта mutex.

void lock();

Замечания

Если сохраненный mutex указатель имеет значение NULL, этот метод создает system_error с кодом operation_not_permittedошибки.

Если вызывающий поток уже является владельцем соответствующего объекта mutex, этот метод создает исключение system_error, содержащее код ошибки resource_deadlock_would_occur.

В противном случае этот метод вызывает метод lock соответствующего объекта mutex и устанавливает внутренний флаг владения для потока в значение true.

mutex

Извлекает сохраненный указатель на соответствующий объект mutex.

mutex_type *mutex() const noexcept;

operator bool

Указывает, является ли вызывающий поток владельцем соответствующего мьютекса.

explicit operator bool() noexcept

Возвращаемое значение

true если поток является владельцем мьютекса; в противном случае false.

operator=

Копирует сохраненный указатель mutex и соответствующее состояние владения из указанного объекта.

unique_lock& operator=(unique_lock&& Other) noexcept;

Параметры

Другое
Объект unique_lock.

Возвращаемое значение

*this

Замечания

Если вызывающий поток является владельцем ранее назначенного объекта mutex, то перед вызовом unlock на mutex этот метод назначает новые значения.

После копирования этот метод задает другое состояние, созданное по умолчанию.

owns_lock

Указывает, является ли вызывающий поток владельцем соответствующего объекта mutex.

bool owns_lock() const noexcept;

Возвращаемое значение

true если поток является владельцем mutex; в противном случае false.

выпуска

Отменяет связь объекта unique_lock с объектом mutex.

mutex_type *release() noexcept;

Возвращаемое значение

Предыдущее значение сохраненного указателя mutex.

Замечания

Этот метод устанавливает значение сохраненного указателя mutex в 0 и устанавливает внутренний флаг владения mutex в false.

swap

Меняет местами соответствующий mutex и статус владения с аналогичными свойствами указанного объекта.

void swap(unique_lock& Other) noexcept;

Параметры

Другое
Объект unique_lock.

try_lock

Попытки получить права владельца связанного объекта mutex без блокировки.

bool try_lock() noexcept;

Возвращаемое значение

Значение true, если метод успешно получает права владельца mutex; в противном случае — значение false.

Замечания

Если сохраненный mutex указатель имеет значение NULL, метод создает system_error с кодом operation_not_permittedошибки.

Если вызывающий поток уже является владельцем объекта mutex, этот метод создает исключение system_error, содержащее код ошибки resource_deadlock_would_occur.

try_lock_for

Попытки получить права владельца связанного объекта mutex без блокировки.

template <class Rep, class Period>
bool try_lock_for(
    const chrono::duration<Rep, Period>& Rel_time);

Параметры

Rel_time
Объект chrono::duration, который указывает максимальный интервал времени, в течение которого метод пытается получить права владельца объекта mutex.

Возвращаемое значение

Значение true, если метод успешно получает права владельца mutex; в противном случае — значение false.

Замечания

Если сохраненный mutex указатель имеет значение NULL, метод создает system_error с кодом operation_not_permittedошибки.

Если вызывающий поток уже является владельцем объекта mutex, этот метод создает исключение system_error, содержащее код ошибки resource_deadlock_would_occur.

try_lock_until

Попытки получить права владельца связанного объекта mutex без блокировки.

template <class Clock, class Duration>
bool try_lock_until(const chrono::time_point<Clock, Duration>& Abs_time);

bool try_lock_until(const xtime* Abs_time);

Параметры

Abs_time
Момент времени, определяющий порог, после которого метод больше не пытается получить права владельца объекта mutex.

Возвращаемое значение

Значение true, если метод успешно получает права владельца mutex; в противном случае — значение false.

Замечания

Если сохраненный mutex указатель имеет значение NULL, метод создает system_error с кодом operation_not_permittedошибки.

Если вызывающий поток уже является владельцем объекта mutex, этот метод создает исключение system_error, содержащее код ошибки resource_deadlock_would_occur.

Конструктор unique_lock

Формирует объект unique_lock.

unique_lock() noexcept;
unique_lock(unique_lock&& Other) noexcept;
explicit unique_lock(mutex_type& Mtx);

unique_lock(mutex_type& Mtx, adopt_lock_t Adopt);

unique_lock(mutex_type& Mtx, defer_lock_t Defer) noexcept;
unique_lock(mutex_type& Mtx, try_to_lock_t Try);

template <class Rep, class Period>
unique_lock(mutex_type& Mtx,
    const chrono::duration<Rep, Period>
Rel_time);

template <class Clock, class Duration>
unique_lock(mutex_type& Mtx,
    const chrono::time_point<Clock, Duration>
Abs_time);

unique_lock(mutex_type& Mtx,
    const xtime* Abs_time) noexcept;

Параметры

Mtx
Объект типа мьютекс.

Rel_time
Объект chrono::duration, который указывает максимальный интервал времени, в течение которого метод пытается получить права владельца объекта mutex.

Abs_time
Момент времени, определяющий порог, после которого метод больше не пытается получить права владельца объекта mutex.

Другое
Объект unique_lock.

Замечания

Первый конструктор создает объект, у которого значение соответствующего указателя мьютекса равно 0.

Второй конструктор перемещает связанное состояние мьютекса из Other. После перемещения другие больше не связаны с мьютексом.

Оставшиеся конструкторы хранятся в качестве хранимого mutex указателя. Состояние владения mutex определяется с помощью второго аргумента, если он существует.

Имя Описание
No argument Для получения состояния владения вызывается метод lock соответствующего объекта mutex.
Adopt Предполагается, что состояние владения есть. Mtx должен быть заблокирован при вызове конструктора.
Defer Предполагается, что вызывающий поток не является владельцем объекта mutex. Mtx не должен быть заблокирован при вызове конструктора.
Try Для получения состояния владения вызывается метод try_lock соответствующего объекта mutex. Конструктор не выбрасывает никаких исключений.
Rel_time Для получения состояния владения вызывается метод try_lock_for(Rel_time).
Abs_time Для получения состояния владения вызывается метод try_lock_until(Abs_time).

Деструктор ~unique_lock

Освобождает все ресурсы, связанные с объектом unique_lock.

~unique_lock() noexcept;

Замечания

Если вызывающий поток является владельцем соответствующего объекта mutex, деструктор освобождает права владения, вызывая метод unlock для объекта mutex.

разблокировано

Освобождает права владения для соответствующего объекта mutex.

void unlock();

Замечания

Если вызывающий поток не является владельцем соответствующего объекта mutex, этот метод создает исключение system_error с кодом ошибки operation_not_permitted.

В противном случае этот метод вызывает метод unlock соответствующего объекта mutex и устанавливает внутренний флаг владения для потока в значение false.

См. также

Справочник по файлам заголовков
<mutex>