如何在 C++ 中锁定多个锁,其中一些是共享的,一些不是

jan*_*b04 4 c++ concurrency mutex deadlock locking

假设我有一些线程安全类。它使用 astd::shared_mutex来防止并发访问。只读操作使用 a std::shared_lock,而写操作使用std::scoped_lock.

现在,在复制赋值运算符的情况下,受让人和被分配对象的互斥体都必须被锁定,除了受让人被修改并且必须锁定其互斥体,std::shared_lock而被分配的对象是只读的并且必须使用锁定std::scoped_lock。据我所知,在不使用特定的锁定排序算法的情况下锁定多个互斥体(像这样)可能会导致死锁。

std::lock通常可以通过使用or来避免死锁std::scoped_lock,但在这种情况下,不能使用它们,因为其中一个std::shared_mutexes 不能是locked,而是lock_shareded。

如何锁定多个锁以避免死锁,其中有些锁是共享的,有些不是?

ALX*_*23z 5

您应该以同样的方式使用std::lock多个互斥体的函数。

让我举一个例子:

  std::mutex m;
  std::shared_mutex sm;
 
  std::unique_lock ul(m,std::defer_lock);
  std::shared_lock sl(sm,std::defer_lock);
  
  std::lock(ul,sl);
Run Code Online (Sandbox Code Playgroud)

函数std::lock只是简单地应用try_lock()/unlock(),直到它在所有可输入的可锁定对象上成功为止,而 的shared_lock方法则lock/try_lock强加共享锁定(用于读取)。