3

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

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

对于 QMutex:

解锁未锁定的互斥锁会导致未定义的行为。

对于 QReadWriteLock:

尝试解锁未锁定的锁是错误的,将导致程序终止。

能够查询互斥锁的状态也非常方便调试断言在开始某些操作之前测试,我确实拥有那个“长寿命”锁。

但我真正想要的只是如果我有锁就能够解锁互斥锁,如果我没有锁就不能解锁它。那会让我很开心。IMO 该unlock()功能应该已经为我执行此操作,但事实并非如此。

有什么办法吗?

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

4

2 回答 2

1

用于QMutex::locked()确定互斥锁的状态。

我不相信 QReadWriteLock 中有等效的功能。话虽如此,您可以使用tryLockForRead(),tryLockForWrite()函数(根据返回 true 或 false )来确保您设法获得锁,如果是这样,稍后解锁它们。

于 2010-02-21T16:06:18.300 回答
1

未经测试的代码,但如果 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

于 2010-02-21T17:10:12.437 回答