P-P*_*P-P 27 concurrency deadlock locking
我了解到我应该解锁逆序以锁定订单.例如.
A.lock();
B.lock();
B.unlock();
A.unlock();
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做会发生什么:
A.lock();
B.lock();
A.unlock();
B.unlock();
Run Code Online (Sandbox Code Playgroud)
我尝试制作一个死锁场景,但如果我总是先锁定A然后B,那么我不知道会发生什么样的死锁.你能帮我吗?
Adr*_*thy 42
在给出的简单情况下,不需要以相反的顺序解锁以避免死锁.
但是,随着代码变得越来越复杂,以相反的顺序解锁会帮助您保持正确的锁定顺序.
考虑:
A.lock();
B.lock();
Foo();
A.unlock();
Bar();
B.unlock();
Run Code Online (Sandbox Code Playgroud)
如果Bar()
尝试重新获取A,您实际上已经破坏了锁定顺序.你拿着B然后试图得到A.现在它可以陷入僵局.
如果您以相反的顺序解锁(如果使用RAII,则非常自然):
A.lock();
B.lock();
Foo();
B.unlock();
Bar();
A.unlock();
Run Code Online (Sandbox Code Playgroud)
然后,如果Bar()
尝试进行锁定并不重要,因为将保留锁定顺序.
你的例子永远不会与自己陷入僵局.以相反的顺序解锁并不重要,它以一致的顺序锁定.这将是死锁,即使解锁顺序相反
Thread 1
A.lock();
B.lock();
B.unlock();
A.unlock();
Thread 2
B.lock();
A.lock();
A.unlock();
B.unlock();
Run Code Online (Sandbox Code Playgroud)