Как вы можете определить, заблокирован ли QMutex или нет? - PullRequest
13 голосов
/ 30 декабря 2011

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

bool QMutex::tryLock()

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

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

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

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

Ответы [ 4 ]

23 голосов
/ 30 декабря 2011

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

7 голосов
/ 03 января 2012

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

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

bool is_locked = true;

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

if( is_locked )
{
    ...
}

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

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

4 голосов
/ 01 января 2012

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

1 голос
/ 01 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...