首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMutex卡在锁定状态

QMutex卡在锁定状态
EN

Stack Overflow用户
提问于 2010-01-23 07:11:00
回答 4查看 3.4K关注 0票数 3

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

更新:问题是由于线程在两次函数调用之间没有休眠。也许睡眠不足使互斥锁重新锁定的速度非常快?你也可以调用yieldCurrentThread();

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-27 10:58:33

互斥锁在从同一个QThread解锁后立即重新锁定,速度如此之快,以至于主线程没有时间将其锁定回来。添加睡眠或yieldCurrentThread()解决了这个问题

票数 0
EN

Stack Overflow用户

发布于 2010-01-23 07:19:42

如果在函数中抛出异常,则可能无法执行末尾的unlock()。为了确保在这种情况下解锁QMutex,可以使用QMutexLocker对象进行锁定。当对象被销毁时,它将自动解锁互斥体,即使这发生在异常后的堆栈解开过程中。

票数 5
EN

Stack Overflow用户

发布于 2011-02-24 02:01:24

在Mac上,我有QMutex挂起,即使在100%的正确逻辑。我在QMutex周围做了一个包装器调用,这增加/减少了原子引用计数,而QMutex挂在一个地方,引用计数表示没有持有互斥锁。

这在Qt3中发生过一次,在最近的Qt中也发生过一次(4.6.2或4.7.0,我不记得了)。用自定义类替换QMutex,直接进入操作系统原语--解决了这个问题。

但是请注意,这个问题只发生在我的情况下的OS X上。在Windows上,同样的代码可以完美地运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2121200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档