\section{Les mutex}

Les mutex ont été mis en \oe{}uvre à l'aide d'un entier dans une structure, si le mutex est libre, alors cet entier est égal \texttt{1}, sinon il est égal à \texttt{0}. La fonction \texttt{\_\_sync\_bool\_compare\_and\_swap} est utilisée afin de tester la nullité de l'entier codant l'état du mutex et de réserver ce dernier atomiquement.

La difficulté réside dans la mise en \oe{}uvre du comportement à avoir lorsque le mutex est déjà réservé.

Une structure de mutex stocke une FIFO mise en \oe{}uvre à l'aide de \texttt{STAILQ}. Cette FIFO stocke quant à elle des threads en attente de la fin de l'utilisation du mutex en question.

Lorsqu'un thread demande l'accès à un mutex déjà réservé, il est retiré de la liste d'attente de l'ordonnanceur, puis est mis dans la FIFO du mutex. Lorsque le thread qui est en train d'utiliser le mutex libère ce dernier, il prend le premier thread de la FIFO du mutex et le rajoute dans la liste d'attente de l'ordonanceur.

Ce système permet de ne pas donner la main à un thread en train d'attendre l'accès à un mutex, et donc d'économiser des changements de contextes. De plus, il permet de choisir un thread attendant un mutex à libérer en temps constant, pour ensuite le rajouter dans la liste d'attente de l'ordonnanceur.