Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1273 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Attente passive de plusieurs sémaphores

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Attente passive de plusieurs sémaphores

n°2280801
holy-calam​ity
Posté le 04-05-2016 à 14:14:16  profilanswer
 

Bonjour à tous :)
 
Je suis en train d'écrire un programme en C qui est assimilable à un échange maitre/esclave.
Dans ce programme, j'ai besoin de surveiller des sémaphores.
Concrètement j'ai un sémaphore qui va indiquer que je peux recevoir des datas et un autre sémaphore indiquant que je peux en émettre.
Le but serait de faire une attente passive et se réveiller quand l'un des 2 sémaphores est disponible.
 
Par exemple, mon esclave attend de recevoir des données du maitre. Si des données arrivent, un sémaphore est libéré côté esclave.
Parallèlement à ça, dans un thread différent, l'esclave fait un traitement des données reçues précédemment. A la fin de ce traitement, il libère un sémaphore indiquant qu'il est prêt à envoyer le résultat au maitre.
J'aimerai donc gérer le fait que des fois, je vais d'abord recevoir des nouvelles données du maitre avant de lui envoyer le résultat du calcul précédent.
Mais dans certains cas je peux aussi envoyer le résultat du calcul avant que le maitre ne m'envoie à nouveau des données à traiter.
 
Je veux donc attendre 2 sémaphores, et dès qu'une des 2 sémaphores est disponible, me réveiller pour faire la tâche associée.
 
Est-ce que quelqu'un aurait une idée de comment faire?
 
Merci à tous :)

mood
Publicité
Posté le 04-05-2016 à 14:14:16  profilanswer
 

n°2280817
tpierron
Posté le 04-05-2016 à 15:21:03  profilanswer
 

Ha, ha, laisse-moi deviner, tu es sur un système posix ? Parce que sous Windows, ça aurait été torché en un appel de fonction: WaitForMultipleObjects(). Il y a pas mal de trucs moisi sous Windows, mais ça c'est vraiment bien foutu: un genre de select que tu peux appliquer sur un peu près tout: semaphore, mutex, process, thread, pipe, fichier, connexion TCP, évènement d'une fenêtre, etc....
 
Avec la lib pthread, faudra passer par des variables conditions, et le code ne sera pas spécialement trivial. Tu peux t'inspirer de ça:
http://stackoverflow.com/questions [...] ary-sleeps
 
(c.f. première réponse). Les fonctions qui t'intéresseront sont pthread_cond_signal() et pthread_cond_wait(). J'évite le détail, parce qu'il y en a potentiellement pour des pages....
 

n°2280818
holy-calam​ity
Posté le 04-05-2016 à 15:29:59  profilanswer
 

Oui voilà il m'aurait fallu une sorte de select(), ça aurait été parfait.
Je suis sur Linux et j'espérais ne pas avoir à utiliser pthread car j'essaye de passer par OpenMP pour sa simplicité et sa meilleure portabilité pour ce que je veux en faire...
 
J'étais plutôt parti vers plusieurs sem_timedwait() imbriqués dans une boucle infinie. Mais je pense que lorsque je vais vouloir augmenter ma vitesse de traitement, je vais devoir diminuer le temps d'attente du sem_timedwait() et je vais me retrouver avec une sorte de boucle infinie faisant tourner le CPU à 100%...

n°2280832
tpierron
Posté le 04-05-2016 à 22:38:22  profilanswer
 

Je me demande si tu ne ferais pas mieux d'utiliser autre chose que des sémaphores. J'ai un peu de mal à voir comment tout ça communique, mais de ta description, je me demande si un ou plusieurs tube de communication (via pipe()) ne ferait pas l'affaire. Au moins tu pourrais faire un select() sur les descripteurs retournées et utiliser le tube de communication pour passer des messages.

n°2280875
holy-calam​ity
Posté le 06-05-2016 à 09:22:58  profilanswer
 

Ce n'est pas bête du tout, c'est même plutôt malin :)
Je vais creuser dans ce sens là, mais ça m'a l'air pas mal.
 
Merci beaucoup :D

n°2280946
rufo
Pas me confondre avec Lycos!
Posté le 08-05-2016 à 10:48:30  profilanswer
 

Le modèle maître/esclave se rapproche du modèle producteur/consommateur, je pense. Mais ça suppose qu'il y ait un buffer partagé entre le producteur et le consommateur et donc un mutex (sémaphore) sur ce buffer pour pas écrire au même endroit qu'une lecture en cours.
 
Je dirais que si c'est dans un but pédagogique ce programme, il faut clairement l'écrire avec des sémaphores. Sinon, un pipe peut faire l'affaire.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Attente passive de plusieurs sémaphores

 

Sujets relatifs
Implémentations de plusieurs pipessomme de plusieurs cellules selon si vides ou pas
simulation de temps de réponse de file d'attente m/m/1 en foction de tInfinite Scroll sur plusieurs DIV
Importer des données de plusieurs fichiers, sous conditionFormulaire avec plusieurs submit / Safari
aide pour la decopmposition d'une image en plusieurs matrices?Harmoniser les dates de séries temporelles de plusieurs pays
Comment mettre à jour plusieurs branches ?Additionner la valeur numérique de plusieurs TextBox
Plus de sujets relatifs à : Attente passive de plusieurs sémaphores


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR