Les solutions logicielles font les hypothèses suivantes :
fonction TestAndSet(var but : booleen) : booleen debut TestAndSet := but; but := true; finUne solution non équitable pour N processus au problème de la section critique avec un booléen lock initialise à false.
debut
tant que vrai faire debut
tant que TestAndSet(lock) faire rien
Section Critique
lock := false
Section Non Critique
fin
fin
Certains processeurs possèdent une instruction TestAndSet.
procedure swap(var a, b : booleen) debut aux := a; a := b; b := aux finUne solution non équitable pour N processus au problème de la section critique avec un booléen lock et N booléens key[i] initialises à false.
debut
tant que vrai faire debut
key[i] := true;
tant que key[i] faire
swap(lock,key[i]);
Section Critique;
lock := false
Section Non Critique
fin
fin
Certains processeurs possèdent une instruction swap.
procedure wait(var S : entier) procedure signal(var S : entier) debut debut tant que (S <= 0) faire rien; S := S + 1 S := S - 1; fin finUne solution non équitable pour N processus au problème de la section critique avec un entier mutex initialisé à 1.
debut
tant que vrai faire debut
wait(mutex);
Section Critique;
signal(mutex);
Section Non Critique
fin
fin
Aucun processeur ne possède ces instructions.
Il existe des solutions équitables.
Le défaut commun à ces solutions est l'attente active (gaspillage de l'UC).