Je vais implémenter un programme où un processus parent lit un fichier texte et envoie les données qu'il lit dans un tampon de mémoire partagée qui va être lu par certains processus enfants. Tout ce travail sera médiatisé par des sémaphores. Supposons que le parent va lire un caractère à la fois à partir du fichier et que le tampon de mémoire partagée contient 5 emplacements.Problème de producteur/consommateur
Au début, je pensais seulement avoir 2 sémaphores:
writeSemaphore
, initialisé à 5, est le sémaphores qui indique si l'auteur est autorisé à écrire dans la mémoire tampon. quand il descendra finalement à 0, le processus parent sera bloqué jusqu'à ce que l'un des enfants le déverrouille (après avoir lu un bloc).
readSemaphore
, initialisé à 0, est le sémaphore qui indique si l'un des lecteurs est autorisé à lire dans le tampon. Mais maintenant que je pense à cela, cela ne m'empêcherait pas d'avoir 2 consommateurs accédant à la mémoire partagée en même temps. Je dois l'empêcher. J'ai donc introduit un troisième sémaphore:
allowedToRead
qui est 1 ou 0, qui permet ou bloque l'accès aux processus enfants.
Voici le code pseudo pour les enfants et les parents:
enfant:
while (something) {
wait(readSemaphore)
wait(allowedToRead)
<<read from shared memory>>
post(allowedToRead)
post(writeSemaphore)
}
Parent:
while (something) {
wait(writeSemaphore)
<<writes to shared memory>>
post(allowedToRead)
}
est mon raisonnement correct?
Merci
Vous pourriez trouver Boost.Interprocess utile pour vous épargner un peu de lourdeur dans la gestion de la mémoire partagée. Il y a des constructions directes en continu de processus à processus décrites ici: http://www.boost.org/doc/libs/1_45_0/doc/html/interprocess/streams.html –
Ceci est pour l'école, donc pas de boost pour moi. –