2011-12-30 3 views
9

Кто-нибудь знает, как проверить и посмотреть, если QMutex заблокирован, без использования функции:Как узнать, заблокирован ли QMutex или нет?

bool QMutex::tryLock()

Причина, почему я не хочу использовать tryLock() является потому, что он делает две вещи:

  1. Проверьте и заблокируйте мьютекс.
  2. Если он не заблокирован, то заблокируйте его.

Для моих целей, я не заинтересован в выполнении этого второго шага (блокировка мьютекса).

Я просто хочу знать, заблокирован он или нет.

+1

Почему блокировка by :: tryLock вас беспокоит? Вы можете разблокировать его сразу после получения блокировки.] –

ответ

5

ОК, я предполагаю, что нет реального способа сделать то, что я прошу, без использования tryLock().

Это может быть достигнуто с помощью следующего кода:

bool is_locked = true; 

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

if(is_locked) 
{ 
    ... 
} 

Как вы можете видеть, он разблокирует QMutex, «a_mutex», если он был в состоянии заблокировать его.

Конечно, это не идеальное решение, так как к тому времени, когда оно попадает во 2-й оператор if, статус мьютекса мог бы измениться.

21

Попытка блокировки мьютекса - это, по определению, единственный способ узнать, заблокирован ли он; в противном случае, когда эта мнимая функция вернулась, как бы вы знали, был ли мьютекс еще заблокирован? Он может быть разблокирован, пока функция возвращается; или, что более важно, не выполняя всю очистку и синхронизацию кеша, необходимую для ее блокировки, вы не можете быть уверены, что она заблокирована или нет.

+1

Очень хороший ответ! –

+3

-1 Небольшое примечание. Иногда полезно знать, заблокирован ли мьютекс, не пытаясь его заблокировать, например, для целей статистики, не мешая потокам. Поэтому, несмотря на ваш важный момент, это не «по определению единственный способ сказать, заблокирован ли он» – Artyom

+2

Er, что-то было бы полезно, не означает, что это невозможно по определению. – Hurkyl

4

Возможно, QSemaphore с одним разрешением? Метод available() может дать вам то, что вам нужно.

1

QMutex предназначен только для блокировки и разблокировки. Статистика сбора может быть удовлетворена некоторыми пользовательскими счетчиками.
Попробуйте QSemaphore как @Luca Carion, о котором упоминалось ранее.

Смежные вопросы