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

How to lock multiple locks where some are shared and some are not in C++

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

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

通常可以使用 std::lockstd::scoped_lock 来避免死锁,但在这种情况下,不能使用它们,因为 std::shared_mutex 之一不能是 locked,但 lock_shareded。

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

只要修复您的设计,就不会发生这种情况。死锁和代码维护困难的问题对于这样的设计来说是无法容忍的。

例如,可能将源对象复制到一个临时对象,解锁它,然后将临时对象复制到目标对象。或者,也可以使用一把锁来保护所有对象和架构师,这样您就不会持有它太久。

您应该以同样的方式对多个互斥体使用函数 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);

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