Les problèmes liés à la concurrence


Le maintien de la cohérence

La mise à jour concurrente des données peut se dérouler sans problème, comme dans la figure suivante, où la variable cpt, initialement à 2000, a comme valeur finale 1000 (2000 + 1000 - 2000).

Malheureusement, la mise à jour concurrente peut aussi générer des incohérences, comme dans la figure suivante, où la variable cpt, initialement à 2000, a comme valeur finale 0 après l'exécution du même code.

Section Critique & Exclusion mutuelle

La mise-à-jour de cpt doit s'effectuer en exclusion mutuelle (e.g. seule à l'exclusion de toute autre action) car il s'agit d'une section critique. Une seule thread à la fois modifie cpt. L'autre doit attendre que la thread en cours ait fini.

Solution logicielle à l'exclusion mutuelle

Première solution :

Utiliser un booléen c initialisé à vrai.

tant que (non c) faire rien;
c := faux;
< Début Section Critique (DSC) >
< SC >
< Fin Section Critique (FSC) >
c := vrai;

Solution logicielle (fausse) à l'exclusion mutuelle

Solution logicielle (juste) à l'exclusion mutuelle

L'algorithme de Deckker. Soit i le numéro (0 ou 1) de la thread courante et j le numéro de l'autre thread.

initialisations :

int c[2];
int tour;
c[0] = FALSE;
c[1] = FALSE;
tour = 0;
algorithme :

c[i] = TRUE; 
tour = j;
while ((c[j]) && (tour == j)) {};
< SC >
c[i] = FALSE;

L'inconvénient majeur des solution logicielle : l'attente active

Même si une thread ne fait rien (i.e. elle attend pour la section critique), elle monopolise le processeur !

L'attente active ne devrait pas être permise !

Solutions matérielles (justes) à l'exclusion mutuelle

Le masquage des interruptions.

Une thread qui veut rentrer en section critique inhibe les interruptions pour conserver le processeur jusqu'à ce qu'elle les rétablisse.

L'instruction Test&Set.

procédure Test&Set(var a,b : entier);
début
   a := b;
   b := 1;
fin;

Test&Set(test_i, verrou);
tant que test_i = 1 faire 
   Test&Set(test_i, verrou);
< SC >
verrou := 0;

Problème = attente active !


Retour au sommaire.