Le type moniteur est une autre structure de synchronisation de haut niveau introduite par Hoare en 1974. Un moniteur peut être assimilé à une sorte d'objet de synchronisation, contenant les données communes, et caractérisé par un ensemble d'opérations définis par le programmeur et seules autorisées à accéder (aussi bien en lecture qu'en écriture) à ces données.
Les moniteurs assurent l'exclusion mutuelle sur leurs opérations.
Les processus, lorsqu'ils désirent effectuer des traitements sur les données communes, expédient une demande au moniteur en appelant l'opération correspondante.
La structure du moniteur assure qu'un seul processus à la fois puisse être actif dans celui-ci, les autres étant suspendus en entrée, par le moniteur, dans une file d'attente.
Ainsi, les moniteurs permettent de décharger le programmeur de la contrainte de la gestion des sémaphores, par exemple pour ce qui concerne l'exclusion mutuelle, en déplaçant cette tâche au niveau du système, et en l'occurrence au niveau du moniteur dédié.
Ils permettent aux programmeurs à déclarer explicitement les ressources et données partagées et à les placer dans les moniteurs correspondants.
Des langages dédiés, tels que Pascal concurrent,
autorise la définition et l'emploi de moniteurs.
Reprenons notre exemple de réservation de place d'avion. Il peut être correctement réalisé à l'aide d'un moniteur du type suivant :
NB : les syntaxes suivantes sont basées sur celle de "Pascal concurrent".
type placeAvion = monitor
var places : array [0..n-1] of (occupe, libre);
procedure entry reserve (i : integer, var rep : boolean );
begin
rep := false;
if places[i] = libre
then begin
places[i] := occupe;
rep := true;
end;
end;
begin
(* code d'initialisation*)
for i := 0 to n-1
do places[i] := libre;
end.
Un processus qui souhaite réserver une place d'avion, devra appeler l'opération reserve() sur l'instance du moniteur placeAvion concerner pour effectuer ce traitement.
NB : on peut remarquer que la définition d'un moniteur n'est pas sans rappeler celle d'un objet (données + méthodes, traitement) dans le domaine de la programmation orientée objet.