繁体   English   中英

为什么unique_lock在没有互斥锁时会调用解锁?

[英]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::lockstd::lock(from.m, to.m); 如果这样做, unique_lock将不会解锁互斥锁,因为它们不拥有互斥锁。

还有std::adopt_lock ,它说“我已经拥有了锁”。

这两种方法大多是等价的,除了你不能将std::defer_lockstd::lock_guard ,因为它没有lock方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM