跟我学C++中级篇——std::scoped_lock

一、并行编程的同步

在并行和多线程编程中,一个难点在于多个锁的顺序处理问题。这不小心就有可能引起死锁,所以处理起来一定是慎之又慎。另外多个锁就引出另外一个问题,锁的控制粒度大小。而粒度的大小又可能明显的引起效率的变动。如果锁更多呢?某个锁的内部产生异常怎么办?当然这都有解决方法,但是不是看上去很复杂的样子。
有痛点就会有解决方案,C++17中提供了一个std::scoped_lock。

二、std::scoped_lock

std::scoped_lock,可以理解成域锁,原来是锁一个互斥体,现在是锁一片互斥体。它是采用了RAII机制的一种实现方式并可以通过std::lock的机制来避免死锁。它一下子解决了上面提到的不少的问题。进步从来不是一蹴而就。先看一下其定义:

  template<typename... _MutexTypes>
    class scoped_lock
    {
    public:
      explicit scoped_lock(_MutexTypes&... __m) : _M_devices(std::tie(__m...))
      { std::lock(__m...); }

      explicit scoped_lock(adopt_lock_t, _MutexTypes&... __m) noexcept
      : _M_devices(std::tie(__m...))
      { } // calling thread owns mutex

      ~scoped_lock()
      { std::apply([](auto&... __m) { (__m.unlock(), ...); }, _M_devices); }

      scoped_lock(const scoped_lock&) = delete;
      scoped_lock& operator=(const
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值