Вопрос

Я использую 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 в зависимости), чтобы убедиться, что вам удалось получить блокировки, и, если это так, разблокировать их позже.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top