В Qt, как мне запросить состояние QMutex или QReadWriteLock?
-
21-09-2019 - |
Вопрос
Я использую QReadWriteLock Блокировка QReadWriteLock в моем приложении для защиты доступа к ресурсному объекту.
Я использую QReadLocks и QWriteLocks, где могу, но иногда мне нужна "долговечная" блокировка, которая пересекает границы функций.Поэтому иногда мне нужно иметь возможность запрашивать состояние QReadWriteLock (или QMutex, что то же самое в данной ситуации), потому что разблокировать мьютекс, который уже разблокирован, очень плохо.
Для QMutex:
Разблокировка мьютекса, который не заблокирован, приводит к неопределенному поведению.
Для QReadWriteLock:
Попытка разблокировать блокировку, которая не заблокирована, является ошибкой и приведет к завершению программы.
Возможность запрашивать состояние мьютекса также была бы очень удобна для отладочных утверждений, чтобы проверить, что перед началом какой-либо операции у меня действительно есть эта "долгоживущая" блокировка.
Но все, чего я действительно хочу, это иметь возможность разблокировать мьютекс, если у меня есть блокировка, и не разблокировать его, если у меня его нет.Это сделало бы мой день лучше.ИМО в unlock()
функция уже должна была сделать это за меня, но это не так.
Есть какой-нибудь способ обойти это?
(и нет, используя Recursive
режим не помогает в этой ситуации)
Решение
Непроверенный код, Но это должно быть возможно сделать, если 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
Другие советы
Использование QMutex::locked()
чтобы определить состояние мьютекса.
Я не верю, что в QReadWriteLock есть эквивалентная функция.При этом, как говорится, вы могли бы использовать tryLockForRead()
, tryLockForWrite()
функции (которые возвращают значение true или false в зависимости), чтобы убедиться, что вам удалось получить блокировки, и, если это так, разблокировать их позже.