В Qt как я могу запросить состояние QMutex или QReadWriteLock? - PullRequest
3 голосов
/ 21 февраля 2010

Я использую QReadWriteLock в своем приложении для защиты доступа к объекту ресурса.

Я использую QReadLocks и QWriteLocks, где могу, но иногда мне нужен «долговечный» замок, который пересекает границы функций. Поэтому иногда мне нужно запрашивать состояние QReadWriteLock (или QMutex, то же самое в этой ситуации), потому что разблокировка мьютекса, который уже разблокирован, очень плохая.

Для QMutex:

Разблокировка мьютекса, который не заблокирован, приводит к неопределенному поведению.

Для QReadWriteLock:

Попытка разблокировать не заблокированную блокировку является ошибкой и приведет к завершению программы.

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

Но все, чего я действительно хочу, - это иметь возможность разблокировать мьютекс, если у меня есть замок, и не разблокировать его, если у меня его нет. Это сделало бы мой день. IMO, функция unlock() уже должна сделать это для меня, но это не так.

Есть ли способ обойти это?

(и нет, использование режима Recursive не помогает в этой ситуации)

Ответы [ 2 ]

1 голос
/ 21 февраля 2010

непроверенный код, Но это должно быть возможно сделать, если 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 (= мьютекс получен где-то еще), если он не заблокирован, tryLock () заблокирует его, поэтому снова разблокируйте и верните true (= мьютекс доступен)

Примечание: Другим вариантом будет пользовательский класс с членами QMutex и bool для указания состояния блокировки. Это может работать лучше для вас, так как мьютекс не нужно блокировать и разблокировать, чтобы получить состояние.

Я предлагаю вам пойти на метод № 2

1 голос
/ 21 февраля 2010

Используйте QMutex::locked() для определения состояния мьютекса.

Я не верю, что в QReadWriteLock есть эквивалентная функция. Тем не менее, вы можете использовать функции tryLockForRead(), tryLockForWrite() (которые возвращают true или false в зависимости от), чтобы гарантировать, что вам удалось получить блокировки, и если это так, разблокировать их позже.

...