2016-07-23 70 views
0

在这个例子中,std :: unique_lock调用标志std :: defer_lock。写在cppreference上:“defer_lock_t不获取互斥锁的所有权” 和:“(析构函数)解锁相关互斥锁,如果拥有”为什么unique_lock电话解锁,当他不拥有互斥?

现在,问题!

为什么在这个例子中,std :: unique_lock在析构函数中调用解锁?

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 
} 

?????

+0

std ::锁定它的功能。他们返回无效 –

回答

2

因为std::defer_lock服务说“我会稍后获得锁”,其中std::lock(lock1, lock2)的呼叫。因此,锁在析构函数中调用解锁。为了测试这一点,你可以尝试直接给std::lock互斥对象:std::lock(from.m, to.m);。如果你这样做,unique_lock不会解锁互斥,因为它们不拥有它们。

还有std::adopt_lock,其中说“我已经拥有锁”。

这两种方法大部分是等价的,不同的是你不能使用std::defer_lockstd::lock_guard,因为它没有lock方法。

相关问题