C++并发与多线程编程之unique_lock

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 (mymutex1):所有权权概念

      sbguard1拥有my_mutexl的所有权

      sbguard1可以把自己对mutex(my_mutex1)的所有权转移给其他的unique-lock对象,所以,unique_lock对象这个mutex的所有权是属于 可以转移,但是不能复制。

        a) atd::move

        b) return std::unique lock(std::mutex)

你可能感兴趣的:(C/C++并发与多线程)