![](/img/trans.png)
[英]what does unique_lock mean when a single thread acquire 2 unique_lock of the same mutex?
[英]Why unique_lock call unlock, when he does not owning mutex?
在此示例中,使用标志std :: defer_lock调用std :: unique_lock。 在cppreference上写道:“defer_lock_t不获取互斥锁的所有权”和:“(析构函数)解锁相关的互斥锁,如果拥有”
现在,这个问题!
为什么在这个例子中,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
}
?????
因为std::defer_lock
用于说“我稍后会以某种方式获取锁定”,这对std::lock(lock1, lock2)
的调用就是这样。 因此,锁在析构函数中调用unlock。 要测试它,你可以尝试直接将互斥锁给std::lock
: std::lock(from.m, to.m);
。 如果这样做, unique_lock
将不会解锁互斥锁,因为它们不拥有互斥锁。
还有std::adopt_lock
,它说“我已经拥有了锁”。
这两种方法大多是等价的,除了你不能将std::defer_lock
与std::lock_guard
,因为它没有lock
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.