如何在C ++中锁定多个共享的锁和不共享的锁

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

现在,对于复制分配运算符,必​​须锁定分配给被分配者和对象的互斥体,除了被分配者被修改并且必须以std::shared_lock锁定其互斥体时,分配对象才被锁定。只读,必须使用std::scoped_lock锁定。据我所知,不使用特定的锁排序算法锁定多个互斥锁可能会导致死锁。

通常可以使用std::lockstd::scoped_lock来避免死锁,但是在这种情况下,不能使用死锁,因为std::shared_mutex中的一个不能为{{1} } ed,但lock ed。

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

iCMS 回答:如何在C ++中锁定多个共享的锁和不共享的锁

只需修复您的设计,就不会发生这种情况。像这样的设计将无法解决死锁和代码维护困难的问题。

例如,也许将源对象复制到一个临时对象,对其进行解锁,然后再将该临时对象复制到目标对象。或者,也可以使用一个保护所有对象和架构师的锁,这样您就不必持有太久了。

,

以同样的方式,您应该对多个互斥使用函数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则施加了共享锁定(用于读取)。

本文链接:https://www.f2er.com/1854686.html

大家都在问