Developpez.com

Club des développeurs et IT pro
Plus de 4 millions de visiteurs uniques par mois

Developpez.com - Qt
X

Choisissez d'abord la catégorieensuite la rubrique :

Viadeo Twitter Facebook Share on Google+   
Logo Documentation Qt ·  Page d'accueil  ·  Toutes les classes  ·  Toutes les fonctions  ·  Vues d'ensemble  · 

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-safe(1) 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 à Jonathan Courtois ainsi qu'à Philippe Beaucart 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.

Cette page est une traduction d'une page de la documentation de Qt, écrite par Nokia Corporation and/or its subsidiary(-ies). Les éventuels problèmes résultant d'une mauvaise traduction ne sont pas imputables à Nokia. Qt 4.7
Copyright © 2017 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon, vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.
Vous avez déniché une erreur, une redirection cassée ou tout autre problème, quel qu'il soit ? Ou bien vous désirez participer à ce projet de traduction ? N'hésitez pas à nous contacter ou par MP !
Responsable bénévole de la rubrique Qt : Thibaut Cuvelier -