c++ - 连续的互斥锁阻塞

标签 c++ multithreading mutex

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

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

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

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

关于c++ - 连续的互斥锁阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45283632/

相关文章:

c++ - 系统( "pause")导致堆损坏

java - 如果访问线程是由先前分配变量的同一线程创建的,是否需要 volatile?

C++ - 在 HDF5 中设置列​​名

c++ - Opengl 问题 : Most likely simple texture issue

java - 我怎样才能永远在Android应用程序中保留一个线程?

c++ - 只写互斥锁

c++ - 如果我在函数内部调用另一个函数,我应该解锁吗?

multithreading - 给定足够的内存,当只有一个专用的写线程时,是否不需要锁?

c++ - 编程示例中的混淆

java - 如何让 Callable 等待执行?