Qt在同一个线程的同一个互斥锁上多次调用tryLock()(5.13.2版本)



我有一个关于方法bool QMutex::tryLock(int timeout)的问题。我注意到不同版本(即5.15和6.4)对该方法的描述略有不同。

  • 在5.15版本。如果这个互斥锁是递归互斥锁,则允许在同一线程的同一个互斥锁上多次调用此函数。如果这个互斥锁是一个非递归互斥锁,那么当尝试递归锁定互斥锁时,该函数将总是返回false。">

  • 在6.4版本。,文档中说"在同一个线程的同一个互斥锁上多次调用这个函数会导致死锁。">

我现在使用Qt 5.13.2版本。在同一个线程上多次调用tryLock是正确的吗?或者5.15版本的文档。是不正确的。谢谢!

参:

  • Qt 5.15版本。: https://doc.qt.io/qt - 5.15 -/- qmutex.html # tryLock
  • Qt 6.4.1版本。: https://doc.qt.io/qt-6/qmutex.html tryLock-1

我给QT团队发了一封邮件,但是还没有收到反馈。

首先,让我们确保我们在同一个页面上,确切地了解文档所谈论的内容,以及您正在尝试做的事情:

Qt文档讨论了"尝试递归地锁定互斥锁">,

。这意味着:获得互斥锁,并且在拥有该锁的同时,继续调用代码中的其他函数,该函数也试图获得同一互斥锁。

显然,Qt 5.15通过某种称为"递归互斥"的特殊互斥来支持这种行为,而普通的互斥在第二次尝试锁定时会失败,尽管你的线程已经拥有该互斥上的锁。

显然,在Qt 6.4.1中,他们已经取消了这个机制,所以他们已经回落到一个更原始的行为:试图重新获得互斥锁上的锁,而已经拥有互斥锁上的锁将死锁。(据推测,他们已经废除了递归互斥锁。)

谨慎的做法是为未来设计,避免使用仅在Qt 5.15中可用的功能,并且已知从Qt 6.4.1开始就会失败。您的软件将需要发展,因此您将不可避免地遇到升级到更高版本的Qt的需要。

除此之外,始终控制您所做的一切是一种良好的软件设计实践,因此您应该始终知道您是否获得了对某个互斥锁的锁,因此您永远不应该试图锁定互斥锁两次。Qt 6.4.1似乎是在假定您遵循此实践的情况下设计的。

至于它是否会工作,答案是我们真的不能说,考虑到你所引用的文档;但是如果5.15文档(你已经引用了)也适用于5.13.2版本(你目前正在使用),并且如果你的互斥锁是递归互斥锁,那么它应该可以工作。

最新更新