我有一个函数,它是一个类的一部分,在这个函数中,在函数的开头有一个mutex.lock,在它返回之前有一个mutex.unlock。现在,我遇到了互斥锁处于锁定状态的情况。如果这个函数是我唯一使用那个互斥锁来锁定和解锁的地方,我会怎么做呢?该函数从主线程和1个或2个其他QThreads调用。
更新:问题是由于线程在两次函数调用之间没有休眠。也许睡眠不足使互斥锁重新锁定的速度非常快?你也可以调用yieldCurrentThread();
发布于 2010-01-27 10:58:33
互斥锁在从同一个QThread解锁后立即重新锁定,速度如此之快,以至于主线程没有时间将其锁定回来。添加睡眠或yieldCurrentThread()解决了这个问题
发布于 2010-01-23 07:19:42
如果在函数中抛出异常,则可能无法执行末尾的unlock()。为了确保在这种情况下解锁QMutex,可以使用QMutexLocker对象进行锁定。当对象被销毁时,它将自动解锁互斥体,即使这发生在异常后的堆栈解开过程中。
发布于 2011-02-24 02:01:24
在Mac上,我有QMutex挂起,即使在100%的正确逻辑。我在QMutex周围做了一个包装器调用,这增加/减少了原子引用计数,而QMutex挂在一个地方,引用计数表示没有持有互斥锁。
这在Qt3中发生过一次,在最近的Qt中也发生过一次(4.6.2或4.7.0,我不记得了)。用自定义类替换QMutex,直接进入操作系统原语--解决了这个问题。
但是请注意,这个问题只发生在我的情况下的OS X上。在Windows上,同样的代码可以完美地运行。
https://stackoverflow.com/questions/2121200
复制相似问题