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 finCertains 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 finCertains 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 finAucun 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).