gpt4 book ai didi

c++ - 为什么 unique_lock 调用解锁,当他不拥有互斥量?

转载 作者:行者123 更新时间:2023-11-30 02:30:30 26 4
gpt4 key购买 nike

在这个例子中,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::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 方法。

关于c++ - 为什么 unique_lock 调用解锁,当他不拥有互斥量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38542844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com