我好奇地尝试了一些东西,似乎不起作用。在我做的相同功能
std::mutex mtx1,mtx2;
mtx1.lock ();
mtx2.lock ();
mtx1.unlock ();
mtx2.unlock ();
然后我为几个线程启动它。它意外地(对我来说)陷入了僵局。 我想了解原因。
(谁感兴趣为什么我想知道这样的事情,想法是创建一个互斥字典,并保护对这个互斥体字典的访问) 感谢
答案 0 :(得分:0)
您在评论部分发布的代码与您问题中的代码不同。您的序列如下所示:
mtx1.lock(); // 1
mtx2.lock(); // 2
mtx1.unlock(); // 3
// 4
mtx1.lock(); // 5
mtx2.unlock(); // 6
mtx1.lock(); // 7
一个线程获取mtx2
并尝试锁定mtx1
(第5行)。另一个线程锁定mtx1
,然后继续锁定mtx2
(第2行)。
您对两个互斥锁使用不同的锁定顺序。这是一个死锁的典型例子。
应始终以相同的顺序获取锁以避免死锁。解锁可以按任何顺序完成。