|
|
|
|
|
- Présentation
- Principe
- Comment mettre en place un sémaphore ?
- Les étapes :
- Remarques
- Les fonctions de gestion des sémaphores
- Exemple
Gérer les sémaphores dans les threads : limiter l'exécution simultanée d'un code
Les sémaphores permettent de limiter l'exécution simultanée d'un code (procédure, ligne de code, ...) à un ou plusieurs threads à un instant donné. Un sémaphore peut être partagé par plusieurs applications. Par exemple : Deux threads spécifiques sont utilisés dans une application bancaire : - un thread pour créditer les comptes
- un thread pour débiter les comptes.
A un instant donné, il ne peut y avoir qu'un crédit de compte ou un débit de compte. Remarque : D'autres systèmes permettent également de protéger une partie de code : - Les mutex permettent de limiter l'exécution simultanée d'un code (procédure, ligne de code, ...) à un thread à un instant donné. Un mutex peut être partagé par plusieurs applications. Pour plus de détails, consultez Gérer les mutex dans les threads.
- Les sections critiques permettent de limiter l'exécution simultanée d'un code (procédure, ligne de code, ...) à un thread à un instant donné dans une seule application. Pour plus de détails, consultez Gérer les sections critiques.
Le sémaphore a été créé avec la fonction SémaphoreCrée. - Le thread n°1 exécute la fonction SémaphoreDébut : aucun thread n'est actuellement présent dans le sémaphore.
- Le thread n°1 exécute la partie de code protégée par le sémaphore.
- Pendant que le thread n°1 exécute le code protégé par le sémaphore, un thread n°2 exécute la fonction SémaphoreDébut : le code protégé par le sémaphore étant déjà en cours d'exécution par le thread n°1, le thread n°2 attend le déblocage du sémaphore.
- Le thread n°1 exécute la fonction SémaphoreFin : plus aucun thread n'exécute le code du sémaphore.
- Le thread n°2 peut exécuter le code protégé par le sémaphore.
- Le thread n°2 exécute la fonction SémaphoreFin : plus aucun thread n'exécute le code du sémaphore.
Comment mettre en place un sémaphore ? Les étapes : Les différentes étapes de la mise en place d'un sémaphore sont les suivantes : - Création d'un sémaphore avec la fonction SémaphoreCrée. Le sémaphore est associé à un nom.
- Appel de la fonction SémaphoreDébut avant la portion de code à protéger.
- Appel de la fonction SémaphoreFin pour délimiter la portion de code à protéger. Les lignes de code situées après la fonction SémaphoreFin ne seront plus protégées.
- Destruction du sémaphore avec la fonction SémaphoreDétruit.
Remarques - Les parties de code protégées par un sémaphore doivent être les plus courtes possibles, et concerner uniquement des traitements "critiques".
- Un sémaphore de même nom peut être utilisé pour protéger plusieurs zones de code différentes. Un seul thread pourra être à un instant donné dans une des zones protégées par le sémaphore.
- Lorsqu'un thread est en attente, les ressources du processeur ne sont pas utilisées.
- Les sémaphores s'appliquent aussi bien au thread principal qu'aux threads secondaires (créés avec la fonction ThreadExécute). Il est nécessaire d'éviter le blocage du thread principal. En effet, si le thread principal est bloqué (en attente), l'application ne peut plus s'exécuter.
- Les fonctions SémaphoreDébut et SémaphoreFin doivent être utilisées dans le même traitement (par exemple dans une procédure).
- Les sémaphores peuvent être partagés ou non entre les différentes applications exécutées sur le poste. Il suffit d'indiquer le mode de partage des sémaphores lors de leur création (fonction SémaphoreCrée).
Les fonctions de gestion des sémaphores Les fonctions du WLangage spécifiques à la gestion des sémaphores sont les suivantes :
| | SémaphoreCrée | Crée un sémaphore. | SémaphoreDébut | Bloque le thread en cours en attendant que le sémaphore soit ouvert (c'est-à -dire qu'une place "libre" soit disponible dans la zone protégée). | SémaphoreDétruit | Détruit explicitement un sémaphore. | SémaphoreFin | Autorise un ou plusieurs threads de sortir de la zone protégée par le sémaphore. |
Exemple Pour réaliser une affectation partagée par plusieurs threads, il est nécessaire d'encapsuler dans un sémaphore aussi bien l'affectation des variables que la lecture de ces variables.
Documentation également disponible pour…
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|