unique_lock 类
表示可进行实例化以创建管理 mutex
锁定和解锁的对象的模板。
语法
template <class Mutex>
class unique_lock;
备注
模板参数 Mutex
必须命名为 mutex 类型。
在内部,unique_lock
存储一个指向关联的 mutex
对象的指针,以及一个指示当前线程是否拥有 mutex
的 bool
。
成员
公共 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_permitted
的 system_error。
如果调用线程已拥有关联的 mutex
,则此方法将引发一个错误代码为 resource_deadlock_would_occur
的 system_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_permitted
的 system_error。
如果调用线程已拥有 mutex
,则此方法将引发一个错误代码为 resource_deadlock_would_occur
的 system_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_permitted
的 system_error。
如果调用线程已拥有 mutex
,则此方法将引发一个错误代码为 resource_deadlock_would_occur
的 system_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_permitted
的 system_error。
如果调用线程已拥有 mutex
,则此方法将引发一个错误代码为 resource_deadlock_would_occur
的 system_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_permitted
的 system_error。
否则,此方法将在关联的 mutex
上调用 unlock
,并将内部线程所有权标志设为 false
。