Question

Un moniteur est censé résoudre les problèmes de sémaphores dans des environnements concurrents.
Je cherche une bonne analogie en utilisant un sémaphore vers moniteur.

Veuillez utiliser les informations pour l'analogie:
4 tâches (TaskA, TaskB, TaskC, TaskD)
1 variable varX

Chaque tâche souhaite manipuler varX en fonction d'un événement.

Était-ce utile?

La solution

Disons qu'un groupe de patients veut aller voir un médecin.

Une implémentation de sémaphore serait qu’ils se tiennent tous devant la porte du bureau. Dès qu’un patient sort, ils essaient tous de passer, une personne parvient à entrer, les autres doivent attendre à nouveau.

Une mise en place de moniteur serait, tous les patients entrants sont envoyés dans une salle d’attente, un semblant d’ordre sera déterminé et un patient terminé, un autre sera envoyé au médecin.

Ils sont fondamentalement la même chose, les moniteurs sont juste plus structurés que les sémaphores.

Autres conseils

Vous pouvez également voir un moniteur comme une toilette publique. Une fois que quelqu'un est entré dans une porte fermée des toilettes, la personne à l'intérieur ne veut que personne d'autre ne soit dans cet espace (c'est-à-dire le moniteur). Toutes les autres personnes (discussions) doivent faire la queue devant les toilettes et attendre (wait ()). Une fois que la personne à l'intérieur a fini, elle sort et la personne suivante peut entrer.

Certaines personnes en attente peuvent avoir des problèmes de constipation. Pour des raisons évidentes, ils ne veulent pas rentrer ou revenir sans être prêts à utiliser correctement les toilettes. C'est là qu'ils veulent attendre (attendez ()) jusqu'à ce que leur estomac leur signale (signal ()) qu'ils sont prêts à aller aux toilettes. Avant que cela ne se produise, ils laissent passer tout le monde.

Source: www.mijnadres.net/published/Monitor%20Object%20Pattern.pdf

Il est important de séparer le conflit de ressources de la notification d'événement. Un moniteur et un sémaphore sont utilisés pour limiter l'accès à une ressource partagée. Un moniteur est essentiellement un sémaphore dont le nombre est égal à 1. Si chacune de vos tâches souhaite accéder à un seul varX, vous devez le protéger à l'aide de votre moniteur (ou de votre sempahore de 1):

Monitor.Enter 
// do something with varX
Monitor.Exit

ou

Semaphore.Acquire
// do something with varX
Semaphore.Release

Avec un sémaphore, vous pouvez évidemment définir le nombre de participants autorisés autorisés à la ressource partagée.

Nick.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top