QMutex处于锁定状态

时间:2010-01-22 23:11:00

标签: multithreading qt mutex qmutex

我有一个函数,它是一个类的一部分,在这个函数中,在函数的开头有一个mutex.lock,在它返回之前有一个mutex.unlock。现在我遇到了互斥锁卡在锁定状态的情况。如果这个函数是我使用该互斥锁来锁定和解锁的唯一地方,那么可以做什么呢。该函数从主线程和1或2个其他QThreads调用。

更新:问题是由于线程没有在函数调用之间休眠。也许缺乏睡眠很快就重新锁定了互斥锁?你也可以调用yieldCurrentThread();

4 个答案:

答案 0 :(得分:5)

如果函数中抛出异常,则最后的unlock()可能无法执行。为了确保QMutex在这种情况下解锁,您可以使用QMutexLocker对象进行锁定。当对象被破坏时,该对象将自动解锁互斥锁,即使在异常后的堆栈展开期间发生这种情况。

答案 1 :(得分:0)

我的猜测是,调用此函数的其他线程之一仍然持有锁,并且尚未释放它,因此尝试输入该段代码的下一个线程必须等到锁被释放。

锁定/解锁代码中是否有阻塞调用?

来自Qt QMutex文档:

  

在线程中调用lock()时   尝试调用lock()的其他线程   在同一个地方将阻止,直到   获得锁定调用的线程   解锁()

答案 2 :(得分:0)

互斥锁在从相同的QThread解锁后立即重新锁定,以至于主线程没有时间将其锁定。添加sleep或yieldCurrentThread()修复了问题

答案 3 :(得分:0)

在Mac OS X上,即使是100%正确的逻辑,QMutex也会挂起。我围绕QMutex做了一个包装调用,它增加/减少了一个原子引用计数,QMutex挂在一个地方,其中引用计数表示没有保持互斥锁。

这在Qt3中曾经发生过一次,而在最近的Qt中又发生过一次(4.6.2或4.7.0,我不记得了)。用自定义类替换QMutex,直接转到OS原语 - 解决了这个问题。

但请注意,在我的情况下,此问题仅发生在OS X上。在Windows上,相同的代码工作正常。