On ajoute aux sémaphores introduits précédemment un mécanisme d’exclusion mutuelle sous la forme de simples verrous :
L’interface de manipulation des verrous est la suivante :
void mtx_init(struct mtx_s *mutex); void mtx_lock(struct mtx_s *mutex); void mtx_unlock(struct mtx_s *mutex);
Comparés aux sémaphores, l’utilisation des verrous est plus contraignantes : seul le contexte propriétaire du verrou peut le libérer et débloquer un contexte en attente du verrou. De manière évidente, les verrous peuvent être simulés par des sémaphores dont la valeur initiale du compteur serait 1.
On désire élaborer une solution à ce problème en attachant un contexte à l’activité de chacun des philosophes et un verrou à chacune des fourchettes.
Montrez qu’une solution triviale peut mener à un interblocage, aucun des philosophes ne pouvant progresser.
On considérera que
Considérez aussi les situations dans lesquelles toutes les activités ne participent pas à l’interblocage. Par exemple, une sixième activité indépendante existe en dehors des cinq philosophes.
On modifie l’interface de manipulation des verrous pour que le verrouillage retourne une erreur en cas d’interblocage :
void mtx_init(struct mtx_s *mutex); int mtx_lock(struct mtx_s *mutex); void mtx_unlock(struct mtx_s *mutex);