如何锁定多个锁,其中一些是共享的,一些不是 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::lock
或 std::scoped_lock
来避免死锁,但在这种情况下,不能使用它们,因为 std::shared_mutex
之一不能是 lock
ed,但 lock_shared
ed。
如何锁定多个锁以避免死锁,其中一些锁是共享的,一些不是?
只要修复您的设计,就不会发生这种情况。死锁和代码维护困难的问题对于这样的设计来说是无法容忍的。
例如,可能将源对象复制到一个临时对象,解锁它,然后将临时对象复制到目标对象。或者,也可以使用一把锁来保护所有对象和架构师,这样您就不会持有它太久。
您应该以同样的方式对多个互斥体使用函数 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
强加共享锁定(用于读取)。
假设我有一些线程安全 class。它使用 std::shared_mutex
来防止并发访问。只读操作使用 std::shared_lock
,而写操作使用 std::scoped_lock
.
现在,在复制赋值运算符的情况下,受让人和被分配对象的互斥锁都必须被锁定,除了受让人被修改并且必须用 std::shared_lock
锁定其互斥锁,而对象被assign 是只读的,必须使用 std::scoped_lock
锁定。据我所知,在不使用特定锁定排序算法的情况下锁定多个互斥体,就像这样,可能会导致死锁。
通常可以使用 std::lock
或 std::scoped_lock
来避免死锁,但在这种情况下,不能使用它们,因为 std::shared_mutex
之一不能是 lock
ed,但 lock_shared
ed。
如何锁定多个锁以避免死锁,其中一些锁是共享的,一些不是?
只要修复您的设计,就不会发生这种情况。死锁和代码维护困难的问题对于这样的设计来说是无法容忍的。
例如,可能将源对象复制到一个临时对象,解锁它,然后将临时对象复制到目标对象。或者,也可以使用一把锁来保护所有对象和架构师,这样您就不会持有它太久。
您应该以同样的方式对多个互斥体使用函数 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
强加共享锁定(用于读取)。