c++并发指南-细说unique_lock

来源:互联网 发布:网络诈骗防范常识 编辑:程序博客网 时间:2024/05/16 01:09

c++11有两种基本的锁类型,一种是lock_guard,一种是unique_lock,lock_guard使用十分简单,但是没有提供给程序足够的灵活度,所以c++11标准添加了Mutex RAII机制的另一个类unique_lock,使用也与lock_guard相似,但提供了更好的上锁,解锁的控制。
unique_lock对象以独占所有权的方式管理mutex对象的上锁和解锁操作。其他unique_lock对象同时拥有某个mutex对象的所有权。
unique_lock构造函数如下:
unique_lock构造函数
(1)默认构造函数。
(2)locking初始化。
新创建的unique_lock对象管理mutex对象m,并尝试调用m.lock()对mutex对象进行上锁,如果此时有另外的unique_lock管理了该mutex的对象m,则当前线程会阻塞。
(3)try_locking初始化
新创建的 unique_lock 对象管理 mutex 对象 m,并尝试调用 m.try_lock() 对 Mutex 对象进行上锁,但如果上锁不成功,并不会阻塞当前线程。
(4)deferred初始化
新创建的 unique_lock 对象管理 mutex 对象 m,但是在初始化的时候并不锁住 mutex 对象。 m 应该是一个没有当前线程锁住的 mutex 对象。
(5) adopting 初始化
新创建的 unique_lock 对象管理 mutex 对象 m, m 应该是一个已经被当前线程锁住的 mutex 对象。(并且当前新创建的 unique_lock 对象拥有对锁(Lock)的所有权)。
(6) locking 一段时间(duration)
新创建的 unique_lock 对象管理 mutex 对象 m,并试图通过调用 m.try_lock_for(rel_time) 来锁住 Mutex 对象一段时间(rel_time)
。(7) locking 直到某个时间点(time point)
新创建的 unique_lock 对象管理 Mutex 对象m,并试图通过调用 m.try_lock_until(abs_time) 来在某个时间点(abs_time)之前锁住 Mutex 对象。
(8) 拷贝构造 [被禁用]
unique_lock 对象不能被拷贝构造。
(9) 移动(move)构造
新创建的 unique_lock 对象获得了由 x 所管理的 Mutex 对象的所有权(包括当前 Mutex 的状态)。调用 move 构造之后, x 对象如同通过默认构造函数所创建的,就不再管理任何 Mutex 对象了。

综上所述,由 (2) 和 (5) 创建的 unique_lock 对象通常拥有 Mutex 对象的锁。而通过 (1) 和 (4) 创建的则不会拥有锁。通过 (3),(6) 和 (7) 创建的 unique_lock 对象,则在 lock 成功时获得锁。
值得注意的是,unique_lock 对象同样也不负责管理 Mutex 对象的生命周期,unique_lock 对象只是简化了 Mutex 对象的上锁和解锁操作,方便线程对互斥量上锁,即在某个 unique_lock 对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 unique_lock 的生命周期结束之后,它所管理的锁对象会被解锁,这一点和 lock_guard 类似,但 unique_lock 给程序员提供了更多的自由。

原创粉丝点击