【问题标题】:Why unique_lock call unlock, when he does not owning mutex?当他不拥有互斥锁时,为什么 unique_lock 调用解锁?
【发布时间】:2016-07-23 14:26:13
【问题描述】:

在本例中,std::unique_lock 调用带有标志 std::defer_lock。在 cppreference 上写:“defer_lock_t 不获取互斥锁的所有权” 和:“(析构函数)解锁关联的互斥体,如果拥有”

现在,问题来了!

为什么在这个例子中,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
}

?????

【问题讨论】:

  • std::lock 它只是功能。他们返回无效

标签: c++ multithreading c++11 stl locking


【解决方案1】:

因为std::defer_lock 的意思是“我稍后会以某种方式获得锁”,而对std::lock(lock1, lock2) 的调用会这样做。因此,锁在析构函数中调用解锁。要对此进行测试,您可以尝试将互斥锁直接提供给std::lockstd::lock(from.m, to.m);。如果您这样做,unique_locks 将不会解锁互斥锁,因为它们不拥有它们。

还有std::adopt_lock,上面写着“我已经拥有了锁”。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-16
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2015-01-16
    • 2014-02-28
    相关资源
    最近更新 更多