3

リソース オブジェクトへのアクセスを保護するために、アプリケーションでQReadWriteLockを使用しています。

可能な場合は QReadLocks と QWriteLocks を使用していますが、関数の境界を越える「長寿命」のロックが必要になる場合があります。したがって、すでにロックが解除されているミューテックスのロックを解除するのは非常に悪いため、QReadWriteLock (または QMutex、この状況では同じこと) の状態を照会できる必要がある場合があります。

QMutex の場合:

ロックされていないミューテックスをロック解除すると、未定義の動作が発生します。

QReadWriteLock の場合:

ロックされていないロックを解除しようとするとエラーになり、プログラムが終了します。

ミューテックスの状態を照会できることは、何らかの操作を開始する前にデバッグ アサーションでテストする場合にも非常に便利です。実際に「長寿命」のロックがあるかどうかを確認します。

しかし、私が本当に望んでいるのは、ロックを持っている場合はミューテックスのロックを解除でき、持っていない場合はロックを解除できないことだけです。それは私の一日になります。IMOunlock()関数はすでにこれを行う必要がありますが、そうではありません。

これを回避する方法はありますか?

(いいえ、Recursiveモードを使用してもこの状況では役に立ちません)

4

2 に答える 2

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 に答える