gpt4 book ai didi

c++ - 在 Qt 中,如何查询 QMutex 或 QReadWriteLock 的状态?

转载 作者:太空狗 更新时间:2023-10-29 22:53:29 25 4
gpt4 key购买 nike

我正在使用 QReadWriteLock在我的应用程序中保护对资源对象的访问。

我尽可能地使用 QReadLocks 和 QWriteLocks,但有时我需要一个跨越函数边界的“长生命周期”锁。所以有时我需要能够查询 QReadWriteLock(或 QMutex,在这种情况下也是一样)的状态,因为解锁一个已经解锁的互斥锁是非常糟糕的。

对于 QMutex:

Unlocking a mutex that is not locked results in undefined behavior.

对于 QReadWriteLock:

Attempting to unlock a lock that is not locked is an error, and will result in program termination.

能够查询互斥量的状态对于调试断言来说也非常方便,可以在开始某些操作之前对其进行测试,我确实拥有“长生命周期”锁。

但我真正想要的是如果我有锁就能够解锁一个互斥体,如果我没有锁就不能解锁它。那会让我开心。 IMO unlock() 函数应该已经为我做了这个,但它没有。

有什么办法解决这个问题吗?

(不,使用 Recursive 模式在这种情况下没有帮助)

最佳答案

未经测试的代码,但是如果 Qt Doc 是正确的(尽管关于 tryLock() 返回 true/false 的时间有点短)

QMutex m;

bool queryMutexState(){
//static QMutex lock; if you call this frequent, you may need this "protector"
lock.lock();
bool b(m.tryLock());
if (b)
m.unlock();
//lock.unlock()
return b;
}

尝试加锁,失败则返回false(=mutex在别处获取),如果没有加锁,tryLock()会加锁,再次解锁返回true(=mutex可用)

注意:另一种选择是使用成员 QMutex 和 bool 来指示锁定状态的自定义类。这可能更适合您,因为互斥量不需要锁定和解锁即可获得状态。

我建议你使用方法#2

关于c++ - 在 Qt 中,如何查询 QMutex 或 QReadWriteLock 的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2306432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com