成功的互斥锁锁定阻塞

Succesive mutex locks blocking

本文关键字:锁定 成功      更新时间:2023-10-16

我出于好奇尝试了一些东西,但它似乎不起作用。在我做的相同函数中

std::mutex mtx1,mtx2;
mtx1.lock ();
mtx2.lock ();
mtx1.unlock ();
mtx2.unlock ();

然后我启动它几个线程。它出乎意料地(对我来说(陷入僵局。 我想了解原因。

(对谁感兴趣,为什么我想知道这样的事情,这个想法是创建一个互斥字典,并保护对这个互斥字典的访问( 谢谢

您在评论部分发布的代码与您问题中的代码不同。您的序列如下所示:

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 行(。

您对两个互斥锁使用不同的锁定顺序。这是死锁的典型例子。

应始终以相同的顺序获取锁以避免死锁。解锁可以按任何顺序完成。