gpt4 book ai didi

c++ - unique_lock 可以与 recursive_mutex 一起使用吗?

转载 作者:IT老高 更新时间:2023-10-28 23:13:07 30 4
gpt4 key购买 nike

根据this , unique_lock可通过声明 std::unique_lock<std::recursive_mutex> 用于递归锁定,实际上编译得很好。

但是,从检查代码(gcc 4.8.2 和 4.9.0)看来,unique_lock不服从 _Mutex.lock ,而是自己实现 lock 方法:

  void
lock()
{
if (!_M_device)
__throw_system_error(int(errc::operation_not_permitted));
else if (_M_owns)
__throw_system_error(int(errc::resource_deadlock_would_occur));
else
{
_M_device->lock();
_M_owns = true;
}

显然,这可以防止互斥锁的递归锁定,实际上尝试递归锁定会抛出 resource_deadlock_would_occur异常(exception)。

我在这里遗漏了什么,这是一个错误,还是 unique_lock 的文档有误?

TIA!!!

最佳答案

一个常见的错误是混淆 mutexlock .一个 mutex是一个可以在线程之间共享的对象(否则它将无用)。然而,锁本身并不是线程安全的对象。它不应该在线程之间共享。它通常是堆栈上的本地对象。例如:

void foo()
{
std::unique_lock<std::mutex> lk(mut); // mut comes from some other scope
// mut locked here
// ...
} // mut unlocked here

在上面的例子中,如果 foo()被递归调用,你有未定义的行为,因为你将锁定 mut递归地。在每次递归时,您都会得到一个新的 unique_lock尽管。所以unique_lock不知道递归。如果您确实需要调用foo()递归,你需要使用递归互斥体,例如:

void foo()
{
std::unique_lock<std::recursive_mutex> lk(mut); // mut comes from some other scope
// mut locked here
// ...
} // mut unlocked here

所以:是的,您可以使用 std::unique_lock<std::recursive_mutex> ,是的,你的实现是正确的。

关于c++ - unique_lock 可以与 recursive_mutex 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27626290/

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