Barrière de synchronisationEn programmation concurrente, une barrière de synchronisation permet de garantir qu'un certain nombre de tâches aient passé un point spécifique. Ainsi, chaque tâche qui arrivera sur cette barrière devra attendre jusqu'à ce que le nombre spécifié de tâches soient arrivées à cette barrière. Algorithme mono-barrièrePour réaliser ce premier algorithme de barrière de synchronisation, il faut disposer de deux sémaphores et d'une variable :
Il faut encore définir la constante Barriere : P(MUTEX) Nb_Att++ SI Nb_Att==N ALORS POUR I DE 1 à N-1 FAIRE V(ATTENTE) FIN POUR Nb_Att=0 V(MUTEX) SINON V(MUTEX) P(ATTENTE) FIN SI Limites de l'algorithmeCe premier algorithme est correct mais il n'implémente pas une barrière cyclique. Si les tâches doivent se synchroniser plusieurs fois avec une barrière il est alors nécessaire d'utiliser 2 barrières différentes de manière alternative. Le scénario suivant met en évidence, à l'aide d'un contre exemple, que la même barrière ne peut pas être immédiatement réutilisée :
Le processus B aura donc traversé la deuxième barrière de synchronisation avant que tous les autres processus n'y soient arrivés. Algorithme multi-barrièrePour remédier au problème évoqué ci-dessus et mettre en œuvre une barrière cyclique, il est nécessaire d'introduire un second sémaphore qui permettra au dernier processus d'attendre que tous les autres processus aient effectué leur P(ATTENTE) avant de libérer le mutex. Il faut donc :
Barriere : P(MUTEX) Nb_Att++ SI Nb_Att==N ALORS POUR I DE 1 à N-1 FAIRE V(ATTENTE) FIN POUR POUR I DE 1 à N-1 FAIRE P(PARTI) FIN POUR Nb_Att=0 V(MUTEX) SINON V(MUTEX) P(ATTENTE) V(PARTI) FIN SI Ainsi, si un processus s'exécute plus rapidement que les autres, il ne pourra pas verrouiller le mutex avant que tous les processus ne soient partis. Exemples d'utilisationLes barrières de synchronisation peuvent être utilisées pour
Voir aussi
|