===== 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((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.)) dans les deux chapitres [[threads-reentrancy|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 [[semaphore|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 [[QWaitCondition#wakeOne|wakeOne()]] ou [[QWaitCondition#wakeAll|wakeAll()]]. Utilisez [[QWaitCondition#wakeOne|wakeOne()]] pour relancer un évènement sélectionné aléatoirement, ou [[QWaitCondition#wakeAll|wakeAll()]] pour les relancer tous. L'exemple [[threads-waitconditions|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 à pour la traduction et à ainsi qu'à pour leur relecture !