unique_lock 类

表示可进行实例化以创建管理 mutex 锁定和解锁的对象的模板。

语法

template <class Mutex>
class unique_lock;

备注

模板参数 Mutex 必须命名为 mutex 类型

在内部,unique_lock 存储一个指向关联的 mutex 对象的指针,以及一个指示当前线程是否拥有 mutexbool

成员

公共 Typedef

名称 描述
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,则此方法将引发一个错误代码为 operation_not_permittedsystem_error

如果调用线程已拥有关联的 mutex,则此方法将引发一个错误代码为 resource_deadlock_would_occursystem_error

否则,此方法将在关联的 mutex 上调用 lock,并将内部线程所有权标志设为 true

mutex

检索指向关联的 mutex 的存储指针。

mutex_type *mutex() const noexcept;

operator bool

指定调用线程是否具有关联的 mutex 的所有权。

explicit operator bool() noexcept

返回值

如果线程拥有 mutex,则为 true;否则为 false

operator=

从指定对象复制存储的 mutex 指针和关联的所有权状态。

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

参数

其他
unique_lock 对象。

返回值

*this

备注

如果调用线程拥有以前关联的 mutex,则此方法在 mutex 上调用 unlock 之前,将分配新值。

在复制后,此方法可将 Other 设为默认构造状态

owns_lock

指定调用线程是否拥有关联的 mutex

bool owns_lock() const noexcept;

返回值

如果线程拥有 mutex,则为 true;否则为 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,则此方法将引发一个错误代码为 operation_not_permittedsystem_error

如果调用线程已拥有 mutex,则此方法将引发一个错误代码为 resource_deadlock_would_occursystem_error

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,则此方法将引发一个错误代码为 operation_not_permittedsystem_error

如果调用线程已拥有 mutex,则此方法将引发一个错误代码为 resource_deadlock_would_occursystem_error

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,则此方法将引发一个错误代码为 operation_not_permittedsystem_error

如果调用线程已拥有 mutex,则此方法将引发一个错误代码为 resource_deadlock_would_occursystem_error

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
一个 mutex 类型对象。

Rel_time
一个 chrono::duration 对象,指定此方法尝试获取 mutex 所有权的最大时间量。

Abs_time
一个时间点,指定阈值,在此之后此方法不再尝试获取 mutex 所有权。

其他
unique_lock 对象。

备注

第一个构造函数将构造一个对象,该对象包含值为 0 的关联 mutex 指针。

第二个构造函数将从 Other 中移动关联的 mutex 状态。 在移动后,Other 将不再与 mutex 关联

剩余构造函数将 Mtx 存储为存储的 mutex 指针。 如果第二个参数存在,则由它确定 mutex 的所有权。

名称 描述
No argument 通过在关联的 mutex 对象上调用 lock 方法,获取所有权。
Adopt 已假定所有权。 调用构造函数时,必须锁定 Mtx
Defer 假定调用线程不包含 mutex 对象。 调用构造函数时,不得锁定 Mtx
Try 通过在关联的 mutex 对象上调用 try_lock,确定所有权。 此构造函数不会引发任何操作。
Rel_time 通过调用 try_lock_for(Rel_time) 确定所有权。
Abs_time 通过调用 try_lock_until(Abs_time) 确定所有权。

~unique_lock 析构函数

释放与 unique_lock 对象关联的所有资源。

~unique_lock() noexcept;

备注

如果调用线程拥有关联的 mutex,则析构函数通过调用 mutex 对象上的 unlock 来释放所有权。

解锁

释放关联的 mutex 的所有权。

void unlock();

备注

如果调用线程没有关联的 mutex,则此方法将引发一个错误代码为 operation_not_permittedsystem_error

否则,此方法将在关联的 mutex 上调用 unlock,并将内部线程所有权标志设为 false

另请参阅

头文件引用
<mutex>