2011-12-30 18 views
9

誰でもQMutexがロックされている場合、関数を使用せずに、チェックして確認する方法を知っています:それは2つのことを行いますので、QMutexがロックされているかどうかをどのように確認できますか?

bool QMutex::tryLock()

私はのtryLockを(使用したくない理由は)次のとおりです。

  1. mutexがロックされているかどうかを確認してください。
  2. ロックされていない場合はロックします。

私の目的として、私はこの2番目のステップ(ミューテックスのロック)を行うことには興味がありません。

ロックされているかどうかを知りたいだけです。

+1

:: tryLockでロックするのはなぜですか?ロックを取った直後にロックを解除することができます。] –

答えて

5

OK、実際にはtryLock()を使用せずに私が求めていることを実行する実際の方法はないと思います。

これは、次のコードで達成することができる:あなたが見ることができるように

bool is_locked = true; 

if(a_mutex.tryLock()) 
{ 
    a_mutex.unlock(); 
    is_locked = false; 
} 

if(is_locked) 
{ 
    ... 
} 

それをロックすることができたならば、それは、QMutex、「a_mutex」をアンロックします。

もちろん、これは完璧な解決策ではありません.2番目のif文に当たった時点で、ミューテックスのステータスは変更されている可能性があります。

21

mutexをロックしようとするのは、ロックされているかどうかを判断する唯一の方法です。さもなければ、この虚数関数が返ってきたときに、mutexがであるかどうかを知るには、まだがロックされていますか?機能が復帰している間にロックが解除された可能性があります。より重要なのは、ロックするために必要なすべてのキャッシュフラッシュと同期化を実行せずに、ロックされているかどうかを実際に確認することはできません。

+1

非常に良い答え! –

+3

-1小さなメモですが、mutexがロックしようとせずにロックされているかどうかを知ることは有益です。あなたの重要なポイントにもかかわらず、それは「定義上、ロックされているかどうかを知る唯一の方法」ではありません。 – Artyom

+2

Er、何かが有用であるということは定義上不可能ではないということを意味しません。 – Hurkyl

4

多分QSemaphoreと1つの許可証? available()メソッドは必要なものを与えるかもしれません。

1

QMutexは、ロック機能とロック解除機能のために設計されています。いくつかのカスタムカウンタで統計を収集することができます。
QSemaphoreを@Luca Carionとしてお試しください。

関連する問題