Tutorial d'initiation A la programmation avec l'API Windows
Tutorial d'initiation a la programmation Windows avec Microsoft Visual C++
Chapitre 5Le multithreading4. Synchronisation
Cours théorique :
Les fonctions de synchronisation sont indispensables dans un programme multithread. La mauvaise synchronisation d'une application peut conduire à des plantages ou à des performances totalement désastreuses.
Etudions l'exemple d'un processus contenant deux threads, chacun utilisant le même tableau global. Un tel programme peut donner des résultats surprenant dans le cas d'une mauvaise synchronisation. Par exemple, deux évaluations consécutives de la même variable pourront retourner des valeurs différentes. Ce genre de comportement n'est généralement pas souhaité. Les deux threads devront alors se synchroniser avant d'accéder aux ressources partagées. Dans ce cas, la synchronisation consistera en une exclusion mutuelle (d'autres types de synchronisation seront étudiées plus tard). L'exclusion mutuelle consiste à faire patienter tous les threads demandant l'accès aux données partagées tant que le thread les utilisant n'a pas déclaré qu'il avait terminé. Chaque thread utilise une fonction pour signaler qu'il entre dans une section protégée. Il utilisera ensuite une seconde fonction pour signaler qu'il sort de la section protégée. Si un autre thread demande à entrer dans un bloc protégé, il sera mis en attente. Le thread qui est entré dans la section protégée doit impérativement signaler sa sortie de la section protégée sinon les autres threads resteront en attente. L'accès aux données partagées doit donc être aussi bref que possible.
Les fonctions de synchronisation sont un très bon moyen de mettre des threads en attente tout en conservant une charge processeur nulle. Si un thread entre dans une phase d'attente, son utilisation processeur restera très faible durant toute la période d'attente. Le système lui accordera de nouveau le contrôle dès que cela sera possible.
La synchronisation des threads devra donc toujours être effectuée par des fonctions de l'API et jamais par des boucles. L'utilisation de boucles ne repassant pas le contrôle au système rendrait les performances désastreuses et ralentirait l'exécution du processus lui même car l'accès du processeur serait accordé à des threads en attente, ce qui ne présente aucun intérêt.
|