获取两个互斥锁的锁定,避免死锁

pom*_*roy 10 c++ multithreading deadlock

以下代码包含潜在的死锁,但似乎是必要的:要将数据安全地从另一个容器复制到一个容器,必须锁定这两个容器以防止在另一个线程中发生更改.

void foo::copy(const foo & rhs)
{
    pMutex->lock();
    rhs.pMutex->lock();
    // do copy
}
Run Code Online (Sandbox Code Playgroud)

Foo有一个STL容器,"do copy"主要包括使用std :: copy.如何在不引入死锁的情况下锁定两个互斥锁?

Gre*_*con 15

在实例上施加某种总顺序,foo并且总是以增加或减少的顺序获取它们的锁定,例如,foo1->lock()然后foo2->lock().

另一种方法是使用函数语义,而是编写一个foo::clone创建新实例而不是破坏现有实例的方法.

如果您的代码执行大量锁定,则可能需要复杂的死锁避免算法,例如银行家的算法.