unique_lock可以和recursive_mutex一起使用吗?

Wal*_*rog 12 c++ multithreading locking recursive-mutex

根据这个,unique_lock可以通过声明a来实现递归锁定std::unique_lock<std::recursive_mutex>,实际上编译很好.

但是,通过检查unique_lock不遵循的代码(gcc 4.8.2和4.9.0)_Mutex.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;
  }
Run Code Online (Sandbox Code Playgroud)

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

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

TIA!

How*_*ant 22

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

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

在上面的示例中,如果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
Run Code Online (Sandbox Code Playgroud)

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