Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当他没有互斥锁时,为什么unique_lock调用unlock?_C++_Multithreading_C++11_Stl_Locking - Fatal编程技术网

C++ 当他没有互斥锁时,为什么unique_lock调用unlock?

C++ 当他没有互斥锁时,为什么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

在本例中,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
    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。它们返回的时候是空的