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

一、并行编程的同步

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

二、std::scoped_lock

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

  template
    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)

你可能感兴趣的:(并行编程,C++11,C++,c++)