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

      sbguard1拥有my_mutexl的所有权

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

        a) atd::move

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WJsuperrunner

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值