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

C++ 如何锁定多个锁,其中有些锁是共享的,有些锁不在C++;,c++,concurrency,locking,mutex,deadlock,C++,Concurrency,Locking,Mutex,Deadlock,让我们假设我有一些线程安全类。它使用std::shared_mutex防止并发访问。只读操作使用std::shared_lock,而写操作使用std::scoped_lock 现在,对于copy assignment操作符,必须锁定受让人和被分配对象的互斥体,除非受让人被修改,并且必须使用std::shared_lock锁定其互斥体,而被分配的对象是只读的,并且必须使用std::scoped_lock锁定。据我所知,在不使用特定的锁排序算法的情况下锁定多个互斥锁,例如,可能会导致死锁 通常,可以

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

现在,对于copy assignment操作符,必须锁定受让人和被分配对象的互斥体,除非受让人被修改,并且必须使用
std::shared_lock
锁定其互斥体,而被分配的对象是只读的,并且必须使用
std::scoped_lock
锁定。据我所知,在不使用特定的锁排序算法的情况下锁定多个互斥锁,例如,可能会导致死锁

通常,可以通过使用
std::lock
std::scoped_lock
来避免死锁,但在这种情况下,不能使用它们,因为
std::shared_mutex
es中的一个不能是
lock
ed,而是
lock_shared
ed


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

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


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

同样,您应该对多个互斥体使用function
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\u lock()/unlock()
,直到它在所有输入可锁定项上成功,而
shared\u lock
的方法
lock/try\u lock
施加共享锁定(用于读取)。

复制到临时对象肯定是一个解决方案,但如果对象是一个容器,复制成本很高,该怎么办?为什么这种设计很难维护?它看起来非常简单和直接。@3d图形。。。它很难维护,因为当您持有特定的锁时,由于死锁的风险而有所不同。使用复制+交换怎么样?它不需要同时持有两个锁,如果swap会移动对象的数据,它只会生成一个副本。对移动语义的支持可能也会起作用。你可以从副本中移动它们,所以你只复制一次。很简单。不知何故,我认为锁定共享锁会将其锁定在独占模式,而不是共享模式。我把它和锁定共享互斥锁本身搞混了。