DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / WLangage / Fonctions WLangage / Fonctions standard / Fonctions de gestion des traitements / Threads, sémaphores, signaux et mutex
  • Présentation
  • Principe
  • Comment mettre en place un sémaphore ?
  • Les étapes :
  • Remarques
  • Les fonctions de gestion des sémaphores
  • Exemple
WINDEV
WindowsLinuxJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac Catalyst
Autres
Procédures stockées
Présentation
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.
Principe
Le sémaphore a été créé avec la fonction SémaphoreCrée.
  1. Le thread n°1 exécute la fonction SémaphoreDébut : aucun thread n'est actuellement présent dans le sémaphore.
  2. Le thread n°1 exécute la partie de code protégée par le sémaphore.
  3. 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.
  4. Le thread n°1 exécute la fonction SémaphoreFin : plus aucun thread n'exécute le code du sémaphore.
  5. Le thread n°2 peut exécuter le code protégé par le sémaphore.
  6. 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 :
  1. Création d'un sémaphore avec la fonction SémaphoreCrée. Le sémaphore est associé à un nom.
  2. Appel de la fonction SémaphoreDébut avant la portion de code à protéger.
  3. 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.
  4. 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).
Java En Java, les sémaphores sont uniques pour l'application qui les a créés. Ils ne peuvent pas être partagés entre plusieurs applications.

Les fonctions de gestion des sémaphores

Les fonctions du WLangage spécifiques à la gestion des sémaphores sont les suivantes :
SémaphoreCréeCrée un sémaphore.
SémaphoreDébutBloque 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étruitDétruit explicitement un sémaphore.
SémaphoreFinAutorise 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.
Version minimum requise
  • Version 9
Documentation également disponible pour…
Commentaires
Cliquez sur [Ajouter] pour publier un commentaire

Dernière modification : 20/09/2024

Signaler une erreur ou faire une suggestion | Aide en ligne locale