yan-verdavaine.developpez.com :: Page d'index
IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Synchronisation des threads

Les classes QMutex, QReadWriteLock, QSemaphore et QWaitCondition permettent la synchronisation de threads. Bien qu’elles devraient être aussi simultanées que possible, ils existent des cas pour lesquels les threads doivent être suspendus pour en attendre d’autres : les résultats peuvent alors être compromis, comme par exemple, dans le cas d’accès à une même variable globale simultanément par deux threads.

Synchronisation des threads

QMutex fournit un verrou mutuellement exclusif, ou mutex. Un thread peut contrôler au plus un mutex à tout moment. Si un thread tente d’acquérir le mutex lorsque celui-ci est verrouillé, le thread sera mis en veille jusqu’à ce que le thread parent du mutex le déverrouille. Les mutex sont souvent utilisés pour protéger l’accès aux données partagées (c’est-à-dire les données accessibles simultanément depuis plusieurs threads). Nous utiliserons les mutex pour créer une classe thread-safe1) dans les deux chapitres Ré-entrance et thread-safety qui suivent.

QReadWriteLock est similaire à QMutex, excepté qu’il fait la distinction entre les accès en lecture et en écriture des données partagées et qu’il autorise de multiples lecteurs à accéder aux données simultanément. Quand elle est possible, l’utilisation de QReadWriteLock à la place de QMutex peut rendre les programmes multi-thread plus simultanés.

QSemaphore est une généralisation de QMutex qui protège un certain nombre de ressources identiques, à la différence d’un mutex qui protège exactement une ressource. L’exemple Sémaphores montre une application typique de sémaphores : synchronisation d’accès à un buffer circulaire entre un producteur et un consommateur.

QWaitCondition permet à un thread de réveiller d’autres threads sous conditions : un ou plusieurs threads peuvent s’arrêter jusqu’à ce que QWaitCondition émette une condition avec wakeOne() ou wakeAll(). Utilisez wakeOne() pour relancer un évènement sélectionné aléatoirement, ou wakeAll() pour les relancer tous. L’exemple Conditions d'attente montre comment résoudre le problème producteur-consommateur en utilisant QWaitCondition au lieu de QSemaphore.

Notez que les classes de synchronisation de Qt reposent sur l’utilisation des pointeurs proprement alignés. Par exemple, vous ne pouvez pas utiliser de classes générées avec MSVC.

Remerciements

Merci à <!amnell!> pour la traduction et à <!johnlamericain!> ainsi qu’à <!hornetbzz!> pour leur relecture !

1) Une fonction ou un objet est dit thread-safe quand il peut être utilisé simultanément par plusieurs threads, en considérant uniquement son implémentation.
doc/4.6/threads-synchronizing.txt · Dernière modification: 2010/07/25 16:48 (modification externe)
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki

Copyright © 2025 Developpez LLC Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.