Класс 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
.