J'ai une application avec 2 qthreads qui se comportent comme dans le pseudo-code ci-dessous (les sémaphores sont de type QSemaphore):Mutex échec de déverrouillage lors d'une tentative d'acquérir un 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);
}
Le problème est que le premier fil ne se réveille pas lorsque le premier sémaphores est signalé, à savoir l'application produit la sortie suivante:
about to wait on semaphore 1
signaling semaphore 1
about to wait on semaphore 2
Et voilà. Le premier fil ne se réveille plus.
Maintenant, je change le premier fil pour effectuer les opérations suivantes:
Thread1 {
print("about to wait on semaphore 1");
while (!sem1.tryAcquire(1, 200));
print("finished waiting on semaphore 1");
sem2.release(1);
}
Dans ce cas, le premier fil dort dans la plupart 200ms avant d'essayer d'acquérir à nouveau la sémaphores. Maintenant, je reçois l'erreur suivante:
QWaitCondition::wait(): mutex unlock failure: Invalid argument
Aucun autre mutex ou d'autres primitives de synchronisation sont utilisés par l'application. Quel pourrait être le problème?
Mise à jour:
J'ai enlevé les sémaphores et remplacé chacun avec un QWaitCondition et un QMutex et maintenant il fonctionne très bien. Je n'ai pas fait d'autres changements et je ne sais toujours pas pourquoi la version avec des sémaphores était incorrecte. Ils ont tous deux été initialisés à 0.
Astuce: votre exemple n'a pas besoin d'utiliser '' ni plusieurs fichiers. Utilisez 'qDebug() <<" Success ";' et n'utilisez qu'un seul "#include " dans 'main.cpp'. –
@Kuba Ober threads.h est là à cause de moc, threads.cpp est là pour localiser les sémaphores dans une unité de traduction séparée. Et je préfère la bibliothèque standard du langage sur l'implémentation de Qt (question de goût) :-) – AMA
J'ai supprimé les sémaphores et les ai remplacés chacun par un QWaitCondition et un QMutex et maintenant ça marche très bien. Je n'ai pas fait d'autres changements et je ne sais toujours pas pourquoi la version avec des sémaphores était incorrecte. Ils ont tous les deux été initialisés à 0. – user1576490