Tutorial d'initiation A la programmation avec l'API Windows
Tutorial d'initiation a la programmation Windows avec Microsoft Visual C++
Chapitre 5Le multithreading11. Evénements
Cours théorique :
Les événements peuvent être utilisés dans les fonctions d'attente. L'API Windows fournit des fonctions permettant de créer des événements de manière explicite. L'état de ces événements pourra ensuite être modifié de manière explicite. L'état d'un événement peut être signalé ou non signalé. Lorsqu'un événement est en état non signalé, l'appel à une fonction d'attente provoquera la suspension du thread appelant jusqu'à ce que l'événement passe en état signalé.
Les fonctions CreateEvent() et CloseHandle() peuvent être utilisées pour la création et la destruction d'événements. Les fonctions SetEvent(), ResetEvent() et PulseEvent() pourront ensuite être utilisées pour modifier l'état de l'objet.
Les événements peuvent être configurés de différentes manières. La configuration d'un événement se fait lors de sa création. Si l'objet est en mode 'réinitialisation manuelle' il restera en état signalé tant que son état ne sera pas explicitement réinitialisé grâce à la fonction ResetEvent(). Si plusieurs threads étaient en attente de cet objet, ils seront alors tous libérés au moment ou l'état de l'objet passera à 'signalé'.
Si l'objet est en mode 'réinitialisation automatique', son état sera automatiquement replacé à 'non signalé' dès qu'un thread en attente sera libéré. Si plusieurs threads sont en attente d'un même événement, alors un seul thread sera libéré eu moment ou l'état sera passé à 'signalé'.
Les événements sont un moyen pratique de synchroniser plusieurs threads de manière explicite.
Les événements peuvent par exemple être utilisés pour mettre un thread en attente tandis qu'un autre thread initialise des données. Dès que les données seront initialisées, le ou les threads seront débloqués par le thread ayant initialisé les données.
Tout comme les sémaphores, les événements peuvent être nommés ou non. Si l'événement est nommé, son nom doit être unique dans l'ensemble du système. Si une autre application tente de créer un événement du même nom, la fonction CreateEvent() retournera un HANDLE sur l'événement précédemment créé. Ceci peut être utilisé pour synchroniser des applications entre elles.
|