두 개의 QMutex 객체가 있는데 두 객체를 모두 잠글 필요가 있습니다 (erase()
메서드). 그러나 그 순서는 중요하지 않습니다.
하나의 QMutex가 잠금 해제 (QMutexLocker locker(&listMutex)
) 상태이고 다른 것을 기다리는 것보다 (QMutexLocker locker(&writeMutex)
) 기다리는 중입니다.
하지만 잠금 해제 된 뮤텍스를 기다리는 것이 더 효율적입니다. 그리고 다른 하나를 기다리는 것보다. 대기 시간보다 짧아집니다.
어떻게 이러한 동작을 구현할 수 있습니까?
재귀 QMutex 또는 QSemaphore를 다시 만들고 QMutex와이 새 개체의 상태를 동기화해야하며 QMutex가 아니라이 새 개체를 기다려야합니다.
그래도 작동하지만 어쩌면 QMutex 객체를 복제하지 않고 더 쉬운 방법이 있을까요?QMutex가 거의없는 경우 잠기지 않은 QMutex를 기다리는 중
// You could add a loop around this until both are done...
if (listMutex.tryLock())
{
// list locked... do list stuff
listMutex.unlock();
}
else if (writeMutex.tryLock())
{
// writelocked... do writestuff
listMutex.unlock();
}
주 : 설정된 tryLock 반환됩니다
class MyQThread:
public: QThread
{
...
QList<QString> list;
QString string;
QMutex listMutex;
QMutex writeMutex;
}
void MyQThread::erase()
{
QMutexLocker locker(&listMutex);
list.clear();
QMutexLocker locker(&writeMutex);
string.clear();
}
void MyQThread::run()
{
forever
{
listMutex.lock();
string = list.takeFirst();
listMutex.unlock();
writeMutex.lock();
if(!string.isEmpty())
...//do something
writeMutex.unlock();
}
}
안녕 Funt : –
내가 예를 추가 한 다음 예를 (내가 그것을 테스트하지 않았다) 시도하십시오. – Funt