我在看C++多线程并发实战这本书的时候,看见了一下代码后我懵了:
friend void swap(X& lhs, X& rhs)
{
if (&lhs == &rhs)
return;
std::lock(lhs.m, rhs.m); // 1
std::lock_guard<std::mutex> lock_a(lhs.m, std::adopt_lock); // 2
std::lock_guard<std::mutex> lock_b(rhs.m, std::adopt_lock); // 3
swap(lhs.some_detail, rhs.some_detail);
}
我之前了解过lock_guard,但是看见代码中他的构造函数的时候,心想std::adopt_lock是什么东西??
后面直接看了lock_guard的源码,才豁然开朗:
template<class _Mutex>
class lock_guard
{ // class with destructor that unlocks a mutex
public:
using mutex_type = _Mutex;
explicit lock_guard(_Mutex& _Mtx)
: _MyMutex(_Mtx)
{ // construct and lock
_MyMutex.lock();
}
lock_guard(_Mutex& _Mtx, adopt_lock_t)
: _MyMutex(_Mtx)
{ // construct but don't lock
}
~lock_guard() noexcept
{ // unlock
_MyMutex.unlock();
}
lock_guard(const lock_guard&) = delete;
lock_guard& operator=(const lock_guard&) = delete;
private:
_Mutex& _MyMutex;
};
首先,std::lock_gurad获取的是引用,当我们给定一个adopt_lock_t的时候,就是说我们承诺我们给的锁已经上锁了,不用二次上锁,如果不给的话,那就是给给定的锁上锁;
注意:adopt_lock_t只是一个空结构体,只是起到标记的作用,并没有什么内容上的作用;