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。
如何锁定多个锁以避免死锁,其中有些锁是共享的,有些不是?
您应该以同样的方式使用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强加共享锁定(用于读取)。