2010-12-07 8 views
0

Existe-t-il un moyen, avec les sémaphores unix, de définir leurs valeurs? J'ai besoin de toujours appeler post() de plusieurs consommateurs et de temps en temps appeler un wait() qui attendra le prochain post().Sémaphores Unix question

Comment cela peut-il être réalisé?

La raison en est que je suis en train de mettre en œuvre le problème du producteur/consommateur (1 producteur/jusqu'à 2 consommateurs). Chaque consommateur dispose d'une file d'attente interne où il stocke des éléments qu'il ne semble pas pouvoir mettre sur la sortie car il manque encore d'autres paquets à d'autres consommateurs afin qu'ils soient tous sortis dans le bon ordre (comme ils viennent du producteur) . Lorsque l'une des files d'attente est considérée comme pleine (disons, avec 10 éléments), je voudrais que ce processus attende que l'autre processus termine son travail (comme il n'y a que 2 processus, j'ai la garantie que le paquet cède est le paquet dont j'ai besoin pour commencer à faire un peu de sortie!). Mon idée est que chaque fois qu'un consommateur traite quelque chose et cherche à le mettre dans la sortie, il devrait faire un appel sur quelque chose comme post() sur un sémaphore. Chaque fois qu'un consommateur a sa file d'attente pleine, il devrait faire une sorte de wait() sur ce même sémaphore. De cette façon, quand l'autre consommateur finit son travail, celui-ci est éveillé.

Comment devrait résoudre cette situation? Suis-je sur le bon chemin? Je suis limité à l'utilisation de sémaphores et de mémoire partagée, dans ce projet.

Bien sûr, l'idée est d'éviter autant que possible le filage.

Merci

Répondre

1

Il semble que vous ayez surtout besoin d'une barrière pour synchroniser vos consommateurs. Il semble que Posix en donne une implémentation (pthread_barrier_ *). Créez ainsi votre barrière partagée avec le nombre de consommateurs; quand un consommateur finit, il doit "attendre à la barrière".

Sinon, vous pouvez l'implémenter avec un autre sémaphore.

+0

Je suis bloqué avec des processus/sémaphores, donc les pthreads sont hors de mes possibilités. Vous dites que je peux mettre en œuvre avec un autre sémaphore, et c'est évident - le but de ce poste est de savoir comment. –

+0

Utilisez-vous des sémaphores posix? –

+0

Je pense que oui, même si je ne suis pas sûr à 100%. J'utilise sem_wait/sem_post/sem_open, etc. –

1

Puis-je vous suggère de regarder this video donnée par Stanford sur C Paradigmes. Celui-ci va plus particulièrement à l'utilisation des sémaphores producteur/consommateur.