Les sémaphores et la programmation simultanée
Pour un devoir à la maison j'ai besoin de programmer le scénario suivant. Cela va être fait en utilisant les sémaphores à l'aide de BACI (qui est C--)
Il y a 2 toilettes unisexe qui peut contenir 4 personnes chacune. Puisque c'est unisexe les personnes de même sexe peut être dans la salle de bain en même temps et FIFO n'est pas important. J'ai la base "algorithme" dans ma tête à manipuler 4 hommes et 4 femme pour 1 toilette. Mais je ne sais pas comment ce code. Toute aide serait grandement appréciée. Voici ce que j'ai.
Woman:
Check to see if there are any men in the restroom. If so "wait".
If no men check to see if there are 4 people. If so "wait".
If no men and not 4 use restroom. When leaving signal there is a vacancy.
If last woman signal the men if they are waiting if not signal the woman.
Man:
check to see if there are any woman in the restroom. if so "wait"
If no woman check to see if there are 4 people. If so "wait".
If no woman and not 4 use restroom. when leaving signal there is a vacancy.
if last man signal the women if they are waiting if not signal the men.
Ces instructions supplémentaires ont été fournis
-
Utilisation aléatoire POUR les boucles de simuler le passage du temps dans les endroits appropriés. Cela peut être fait facilement en utilisant une fonction de Délai:
void Delay (void) { int i; int DelayTime; DelayTime = random (DELAY); for (i = 0; i < DelayTime; i++): }
-
où const int DELAY = un certains nombres de 10 à 100.
- D'impression et le format de sortie joliment et imprimer des messages de telle manière que par la lecture de la sortie, on peut tracer l'exécution de la commande.
- Définir le processus jusqu'à boucle pour toujours, et contrôle de l'utilisation du C (ou pause) pour arrêter votre programme.
- A-t-elle optimale?
- Pas de. Mais il ne peut pas avoir faim. Alors, les hommes et les femmes doivent utiliser les toilettes assez.
- Je ne suis pas sûr si vous êtes inquiet au sujet de la famine, mais je suis sûr que votre algorithme a une lacune. Imaginez le cas où un homme se présente alors qu'une femme est déjà dans la salle de bain, et un flux régulier de femmes de continuer à montrer de sorte que la salle de bains est jamais vide.
- oui. c'est l'une des questions que je vais voir et je suis besoin d'aide. La famine. cela pourrait-il être fixé par chaque femme le signal d'un homme et de chaque homme, chaque signal une femme?
- Comment à propos de la limitation de sorte que chaque fois que vous atteindre 4 personnes dans la file d'attente de l'autre sexe vous passez sexes. De cette façon, votre faim problème est résolu.
- Cela sonne comme une bonne idée. Ma question maintenant est de savoir comment puis-je configurer la Femme et de l'homme du processus de sorte que les 4 personnes peuvent aller dans les toilettes à un moment? J'ai mon programme en cours d'exécution afin qu'il permet 1 personne dans la toilette en un moment, sans blocage ou de famine. mais il peut y avoir 4 personnes dans la salle de bain à la fois.
- c'est ce que j'ai à ce jour:
- Un peu hors-sujet, mais votre fonction de temporisation est cassé. Tout bon compilateur compile à l'équivalent de:
void Delay(void) { random(DELAY); }
- Comment gérez-vous les transgenres salle de bains occupants?
- Je ne pense pas que résoudre le problème de la famine. Si vous avez seulement one-man-show up alors que la salle de bain est occupée par une femme, il est toujours à gauche et jambes croisées indéfiniment. Je pense que la famine doit être abordée en tenant compte à la fois les salles de bains. I. E, si la file d'attente contient les deux sexes, l'une des toilettes de services des hommes, les autres femmes, avec une signalisation appropriée pour permettre à la fois au service du même genre quand il y a rien de l'autre sexe dans la file d'attente.
Vous devez vous connecter pour publier un commentaire.
Puisque vous voulez savoir
how to code your algorithm for 1 restroom
, je l'ai fait en C. Il sera une tâche relativement simple pour convertir en C--, comme tout le sémaphore constructions apparaissent tout à fait semblable.De ce que je pourrais faire de votre réponse,
Garder à l'esprit que, comme indiqué, j'ai travaillé sur le problème pour 1-toilettes seulement. Puisque c'est les devoirs, je vous attends pour la développer dans le 2-toilettes vous-même le formulaire.
De travailler son chemin à partir de la Les lecteurs-écrivains problème à notre "Unisexe Toilettes" problème, nous utilisons les variables globales suivantes:
L'incorporation de ces sémaphores & compteurs dans le
man
fonction de thread,De même, la femme fonction de thread, substituts
mcount
avecwcount
,msem
avecwsem
, etx
avecy
. Seulementz
reste est dans leman
fonction, de sorte que les deuxman
&woman
threads en attente sur la même commune de sémaphore. (Pour cette raison, le code a invariablement FIFO-comme comportement, qui assure l'équité/non-faim)Le code complet est comme suit: (Pour compiler, utiliser
gcc filename -lpthread
)Lors de la conversion dans le 2-toilettes forme, notez les sémaphores & compteur de variables que vous auriez besoin à double pour satisfaire à toutes les conditions. Heureux semaphoring!
Voici ce que j'ai. Cela permet à 1 personne dans la toilette en un moment, sans blocage ou de famine. Je suis dans le besoin d'aide avec la façon de faire en sorte 4 personnes peuvent être dans la salle de bain à la fois.
pour 4 toilettes baci code :