1 unique_lock取代lock_guard
unique_lock是一个类模板,比lock_guard灵活,但是占用内存大、耗时。
2 unique_lock第二个参数
2.1 std::adopt_lock
lock guard可以带第二个参数,std::adopt_lock,起标记作用。表示这个互斥量已经被lock(你必须要把互斥量提前lock了,否则会报异常),std: :adopt_lock标记的效果就是“假设调用方线程已经拥有了互斥的所有权(已经lock成功了),通知lock_guard不需要在构造园数中lock这个互斥量了。
unique_lock也可以带std: :adopt_lock标记,含义相同,就是不希望再unique_lock的构造函数中lock这个mutex.
2.2 std::try_to_lock
我们会尝试用mutex的lock()去锁定这个mutex,但如果没有锁定成功,我也会立即返回,并不会阻塞在那里,用这个try_to_lock的前提是你自己不能先去lock.
2.3 std::defer_lock
用这个defer_lock的前提是你不能自己先lock,否则会报异常。defer_lock的意思就是并没有给mutex加锁:初始化了一个没有加锁的mutex,结合unique_lock的重要成员函数使用。
3 unique_lock的重要成员函数
3.1 lock() //枷锁
3.2 unlock() //解锁
3.3 try_lock()//尝试给互后量加锁,如果得不到锁,则返回False,如果拿到了锁,返回true,这个韩函数是不阻塞的。
3.4 release(),返回它所管理的mutex对象指针,并程放所有权 也就是说,这个unique_lock和mutex不再有关系,严格区分unlock()和release()的区别,不要混淆。
如果原来mutex对象于加状态,你有责任接管过来并负责解锁。(realease返回的是原始mutex的指针)
4 unique_lock所有权的传递mutex
std: :unique_lock
sbguard1拥有my_mutexl的所有权
sbguard1可以把自己对mutex(my_mutex1)的所有权转移给其他的unique-lock对象,所以,unique_lock对象这个mutex的所有权是属于 可以转移,但是不能复制。
a) atd::move
b) return std::unique lock(std::mutex)