C++ 当他没有互斥锁时,为什么unique_lock调用unlock?
在本例中,std::unique_lock调用带有标志std::defer_lock。在cppreference中写道:“延迟锁定不获取互斥对象的所有权” 和:“(析构函数)解锁关联的互斥锁(如果有) 现在,问题来了 为什么在这个例子中,std::unique_lock在析构函数中调用unlockC++ 当他没有互斥锁时,为什么unique_lock调用unlock?,c++,multithreading,c++11,stl,locking,C++,Multithreading,C++11,Stl,Locking,在本例中,std::unique_lock调用带有标志std::defer_lock。在cppreference中写道:“延迟锁定不获取互斥对象的所有权” 和:“(析构函数)解锁关联的互斥锁(如果有) 现在,问题来了 为什么在这个例子中,std::unique_lock在析构函数中调用unlock void transfer(Box &from, Box &to, int num) { // don't actually take the locks yet st
void transfer(Box &from, Box &to, int num)
{
// don't actually take the locks yet
std::unique_lock<std::mutex> lock1(from.m, std::defer_lock);
std::unique_lock<std::mutex> lock2(to.m, std::defer_lock);
// lock both unique_locks without deadlock
std::lock(lock1, lock2);
from.num_things -= num;
to.num_things += num;
// 'from.m' and 'to.m' mutexes unlocked in 'unique_lock' dtors
}
void传输(方框和发件人、方框和收件人、整数)
{
//现在还不要把锁拿走
std::unique_lock lock1(from.m,std::defer_lock);
std::unique_lock 2(to.m,std::defer_lock);
//在没有死锁的情况下锁定两个唯一的\u锁
锁(锁1,锁2);
from.num_things-=num;
to.num_things+=num;
//“from.m”和“to.m”互斥锁在“unique_lock”dtor中解锁
}
???因为
std::defer\u lock
用于表示“我稍后将以某种方式获得锁”,调用std::lock(lock1,lock2)
就是这样做的。因此,锁在析构函数中调用unlock。为了测试这一点,您可以尝试将互斥体直接提供给std::lock
:std::lock(从.m到.m)代码>。如果执行此操作,unique_lock
s将不会解锁互斥锁,因为互斥锁不属于它们
还有std::adoption_lock
,上面写着“我已经拥有锁了”
这两种方法基本上是等效的,只是不能将std::defer\u lock
与std::lock\u guard
一起使用,因为它没有lock
方法。std::lock it just function。它们返回的时候是空的