两个线程都在调用 boost::mutex::lock() 时阻塞

Posted

技术标签:

【中文标题】两个线程都在调用 boost::mutex::lock() 时阻塞【英文标题】:Both threads blocking on call to boost::mutex::lock() 【发布时间】:2011-10-05 20:56:30 【问题描述】:

我有一个在两个线程中使用的 boost::mutex。第一个线程不断锁定和解锁互斥锁。第二个线程仅在特定条件下使用互斥锁。当这种情况发生时,两个线程都阻塞在锁上。这可能是什么原因造成的?

关于我的程序的一些随机事实:互斥锁是两个线程之间共享的类的数据成员。在第二个线程中,我将指向互斥锁的指针传递给使用它的函数,但在第一个线程中,我通过引用使用互斥锁。

【问题讨论】:

你能贴出代码说明线程如何使用互斥锁吗? 只有一个想法。这些函数之间是否有任何递归调用或循环依赖关系?如果是,您将不得不使用递归互斥锁(如果这是您的意图)或仅查看您的代码,因为它会创建经典的死锁。 我发现在第一个线程的关键部分调用了一个 Win32 函数,该函数只能从第二个线程调用,因为该线程创建了 Win32 窗口。我不确定在这种情况下我应该怎么做。答案与我提出的问题无关。我们投票关闭吗? 【参考方案1】:

您是否记得在发出条件信号后在主线程中解锁互斥锁?或者,您是否陷入僵局?

【讨论】:

是的,发生了死锁,但不是因为我使用的互斥锁,而是因为不同的函数导致两个线程阻塞在我认为是 Win32 事件队列的地方。

以上是关于两个线程都在调用 boost::mutex::lock() 时阻塞的主要内容,如果未能解决你的问题,请参考以下文章

在线程中传播系统调用中断

避免死锁的方法

在一个线程中序列化传入的aidl调用

HashMap为啥不安全?

async 与 await 线程调用顺序

Linux C 一个简单的线程池程序设计