← Retour aux projets

École 42

Philosophers

Le problème classique du dîner des philosophes : des threads qui doivent manger, dormir et penser indéfiniment, sans jamais se bloquer mutuellement.

Le contexte

N philosophes sont assis autour d'une table, une fourchette entre chaque paire. Chacun doit manger, dormir puis penser en boucle, mais une fourchette ne peut être utilisée que par un seul philosophe à la fois. Le projet impose d'implémenter cette synchronisation avec des threads POSIX et des mutex, sans jamais laisser un philosophe mourir de faim ni le programme se bloquer.

Une ressource partagée, pas copiée

Le point central de l'exercice tient en une phrase simple à énoncer et facile à rater en pratique : une fourchette est une ressource partagée entre deux philosophes voisins, protégée par un unique mutex, et non une valeur que chacun détiendrait de son côté. Faire la distinction entre une donnée dupliquée et une donnée référencée est ce que l'exercice cherche vraiment à faire intégrer : l'exclusion mutuelle ne protège quelque chose que si tous les threads concernés pointent réellement vers le même verrou.

Diagnostiquer une concurrence bloquée

Un programme concurrent qui se bloque ne donne aucune indication directe sur sa cause : rien, de l'extérieur, ne distingue un philosophe qui pense normalement d'un philosophe bloqué sur un mutex. lldb n'étant pas disponible sur cette machine, le diagnostic est passé par l'outil de profiling sample de macOS, qui capture un instantané des piles d'appel de chaque thread à un instant donné. Une approche plus indirecte qu'un débogueur classique, mais une bonne leçon sur la valeur des outils d'observation système quand les outils habituels manquent.

Prouver plutôt que supposer

La concurrence est un des domaines où « ça a l'air de marcher » est le plus trompeur : un interblocage ou une famine peuvent rester invisibles pendant des dizaines d'exécutions avant de se manifester. Ce projet a ancré l'habitude de construire des cas de test délibérément adversariaux, comme un philosophe seul qui ne peut jamais réunir deux fourchettes ou une sortie propre une fois le nombre de repas atteint, plutôt que de considérer un programme correct simplement parce qu'il tourne sans erreur visible.

Code bientôt disponible sur GitHub.