2010-02-21 4 views
3

내 응용 프로그램에서 리소스 객체에 대한 액세스를 보호하기 위해 QReadWriteLock을 사용하고 있습니다.Qt에서 QMutex 또는 QReadWriteLock의 상태를 어떻게 쿼리합니까?

내가 할 수있는 곳에서 QReadLocks와 QWriteLocks를 사용하고 있지만 때로는 함수 경계를 넘는 "수명이 긴"잠금이 필요합니다. 그래서 때로는 이미 잠금 해제 된 뮤텍스 잠금 해제가 매우 나쁘기 때문에 QReadWriteLock (또는 QMutex,이 상황에서 같은 것) 상태를 쿼리 할 수 ​​있어야합니다. 정의되지 않은 동작의 결과를 잠겨 있지 않은 뮤텍스를 잠금 해제

: QMutex를 들어

.

QReadWriteLock를 들어

: 잠겨 있지 잠금을 해제하려고

오류이며, 프로그램이 해지됩니다.

뮤텍스의 상태를 쿼리 할 수 ​​있다는 것은 디버그 어설 션에서 일부 작업을 시작하기 전에 테스트 할 때 매우 유용 할 것이므로 "장시간 지속되는"잠금이 실제로 있습니다.

하지만 정말로 원하는 것은 잠금이있는 경우 뮤텍스를 잠금 해제 할 수 있고 잠금을 해제하지 않으면 잠금을 해제 할 수 있다는 것입니다. 그것은 내 하루를 만들 것입니다. IMO는 unlock() 함수가 이미이 작업을 수행해야하지만 그렇게하지는 않습니다.

어쨌든 주위에?

(도없고, Recursive 모드를 사용하면이 상황에서 도움이되지 않습니다)

답변

1

테스트되지 않은 코드, 하지만이 가능해야한다는해야 할 일이있는 경우 잠겨 있지 않은 경우, (= 뮤텍스가 다른 곳 aquired한다) false를 반환 실패, 설정된 tryLock()는 (= 뮤텍스 availiable이다)를 고정, 그래서 다시 잠금을 해제하고 true를 돌려줍니다

참고 : 또 다른 옵션 것 멤버 QMutex와 bool이 잠금 상태를 나타내는 커스텀 클래스 여야합니다. 뮤텍스를 잠그고 잠금 해제하여 상태를 가져올 필요가 없으므로이 방법이 더 효과적 일 수 있습니다.

난 당신이 방법 # 2

+0

뮤텍스가 재귀 모드 (잠긴 스레드가 무기한으로 다시 잠길 수 있음) 일 때 tryLock 사용에 대한 첫 번째 제안이 실패하는 동안 두 번째 제안 인 래퍼 클래스로 인해 답변을 수락합니다. 그것은 좋은 생각이지만 노키아가 어떻게 생각했는지를 보여 주어야한다. – Lucas

+0

# 2는 예술 상태입니다. # 1은 "더티 해킹"입니다. (예, 재귀 적으로 작동하지 않지만 QMutex/QReadWriteLock 메서드를 사용하여 재귀 뮤텍스를 수행 할 수 있다고 생각하지 않습니다) . – drahnr

1

사용 QMutex::locked()는 뮤텍스의 상태를 확인합니다.

QReadWriteLock에는 동일한 기능이 있다고 생각하지 않습니다. 즉, tryLockForRead(), tryLockForWrite() 함수 (true 또는 false를 반환 함)를 사용하여 잠금을 가져 왔는지 확인하고 나중에 잠금을 해제 할 수 있습니다. Qt는 문서가 (이 설정된 tryLock()가 참/거짓 반환하는 경우에 대해 조금 짧은 비록)

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; 
} 

시도는, 고정하기 올바른지

+1

(내가 전에 사용)이 설정된 tryLock * 방법은 재귀 모드를 사용하는 경우 실패 갈 제안, 나는 생각합니다. 또한, QMutex :: locked()는 Qt3 지원 API에 포함되어 있습니다 (공식 Qt4는 지원하지 않습니다). 나는 그것을 사용할 여유가 없다. 또한 주로 QReadWriteLock을 사용합니다. – Lucas

+0

자물쇠를 자신의 클래스에 캡슐화하고 잠근 횟수와 MyLock에 대한 호출을 허용해야 할 수도 있습니다.num_locks가 0이 될 때까지 unlock()하십시오. – Xorlev

관련 문제