ich eine Anwendung mit 2 QThreads haben zu erwerben versuchen, die weiter unten in der Pseudo-Code wie es sich verhalten (die Semaphore vom Typ QSemaphore):Mutex Unlock-Fehler, wenn ein QSemaphore
Thread1 {
print("about to wait on semaphore 1");
sem1.acquire(1);
print("finished waiting on semaphore 1");
sem2.release(1);
}
Thread2 {
print("signaling semaphore 1");
sem1.release(1);
print("about to wait on semaphore 2");
sem2.acquire(1);
}
Das Problem ist, dass das erste Gewinde nicht aufwacht, wenn der erste Semaphore signalisiert wird, dh die Anwendung die folgende Ausgabe erzeugt:
about to wait on semaphore 1
signaling semaphore 1
about to wait on semaphore 2
Und das ist es. Der erste Thread wacht nicht mehr auf.
Jetzt wechsle ich den ersten Thread folgendes zu tun:
Thread1 {
print("about to wait on semaphore 1");
while (!sem1.tryAcquire(1, 200));
print("finished waiting on semaphore 1");
sem2.release(1);
}
In diesem Fall ist der erste Thread schläft für höchstens 200 ms, bevor er wieder die Semaphore zu erwerben versucht. Jetzt bekomme ich folgende Fehlermeldung:
QWaitCondition::wait(): mutex unlock failure: Invalid argument
Keine andere mutexes oder andere Synchronisations Primitiven von der Anwendung verwendet werden. Was könnte das Problem sein?
aktualisieren:
Ich habe die Semaphore entfernt und ersetzt die jeweils mit einem QWaitCondition und einem QMutex und jetzt funktioniert es ganz gut. Ich habe keine weiteren Änderungen vorgenommen und weiß immer noch nicht, warum die Version mit Semaphoren falsch war. Sie wurden beide auf 0 initialisiert.
Hinweis: Ihr Beispiel muss nicht '' noch mehr Dateien verwenden. Verwenden Sie 'qDebug() <<" Success ";' und verwenden Sie nur eine einzelne '#include ' in 'main.cpp'. –
@Kuba Ober threads.h gibt es wegen Moc, threads.cpp gibt es für die Lokalisierung von Semaphoren in einer separaten Übersetzungseinheit. Und ich bevorzuge die Standardbibliothek der Sprache gegenüber der Implementierung von Qt (Geschmackssache) :-) – AMA
Ich habe die Semaphore entfernt und jeweils durch ein QWaitCondition und ein QMutex ersetzt und jetzt funktioniert es ganz gut. Ich habe keine weiteren Änderungen vorgenommen und weiß immer noch nicht, warum die Version mit Semaphoren falsch war. Sie wurden beide auf 0 initialisiert. – user1576490