Ces programmes illustrent le problème des «conditions de compétition»
(race conditions) et une solution par l'algorithme de Peterson. Toutefois,
l'implémentation directe de cet algorithme se heurte aux optimisations
dans la CPU qui permet d'échanger l'ordre des opérations de lecture et
écriture dans la mémoire. La troisième version donne une solution en
interdisant les échanges.

Tous les programmes contiennent deux threads qui augmentent un compteur
commun 20 million fois. L'objectif est d'utiliser les algorithmes
d'exclusion mutuelle pour atteindre ce nombre.

Il est recommandé d'étudier les programmes dans l'ordre suivant :

- counter-simple.c : aucune exclusion mutuelle
- counter-peterson.c : algorithme de Peterson, implémentation naïve
- counter-fence.c : algorithme de Peterson, avec barrière

"make" compile tous les exemples. Il est utile de comparer les nombres
atteints par les différents variants et leurs temps d'exécution.
Qu'est ce qui se passe si on permet des optimizations dans gcc avec
l'option -O ?

