Réfléchis 5 minutes. Si tu as un changement de contexte entre ces deux lignes :
while(x_freeze(TEST) == BLOQUE);
x_freeze(BLOQUE);
... deux threads à la fois peuvent lancer traite(), et tu l'as dans le fion.
Les mutex utilisent les fonctions atomiques du processeur. Comme un changement de contexte peut avoir lieu absolument n'importe quand, il faut utiliser les fonctions atomiques du processeur. C'est pour ça qu'on a implémenté la fonction dite test_and_set dans les processeurs, qui modifie le contenu d'un mot ET retourne son ancienne valeur, en une instruction.
---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book