Forum Programmation.c échanges asynchrones entre 2 threads

Posté par  .
Étiquettes : aucune
0
9
mar.
2007
Bonjour,

En C, je voudrais faire un échange entre 2 threads de la manière suivante :
- le thread A écrit des messages dans une pile
- le thread B dépile et traite les messages
- de manière asynchrone
- le thread B ne doit pas faire une boucle consommatrice de CPU pour vérifier la présence de messages

ma question ne porte pas sur la pile, mais sur le fonctionnement asynchrone.

j'ai essayé avec des mutex, mais ça ne marchait pas (le thread A lockait toujours le mutex, et le thread B n'avait jamais le lock), et j'ai vu dans le man que :
""
Les fonctions relatives aux mutex ne sont pas fiables par rapport aux signaux asynchrones et ne doivent donc pas être utilisées dans des gestionnaires de signaux
""

alors je me demande, comment faire ?
quels sont vos conseils ?
(je connais le select, mais ça me parait lourd pour une communication entre 2 threads, et je connais les signaux, mais ça me paraît encore plus lourd...)

merci.
  • # la theorie des mutex

    Posté par  . Évalué à 3.

    A bloque la pile
    A ecrit dans la pile
    A debloque la pile

    B bloque la pile
    B lit la pile
    B debloque la pile

    bilan B ou A ne peut pas acceder à la pile quand l'autre y fait une operation.
    • [^] # Re: la theorie des mutex

      Posté par  (site web personnel) . Évalué à 3.

      Pour éviter le deadlock (ou interblocage en français) ne pas oublier que A doit relâcher le verrou si la pile est pleine et attendre que B vienne la vider. Idem dans l'autre sens si la pile est vide.
  • # C'est déjà prévu

    Posté par  . Évalué à 4.

    man msgctl
    man msgget
    man msgsnd
    man msgrcv

    Conformité POSIX.1-2001 (ça fonctionne sous Unix, Linux, BSD, Windows NT…)
  • # sem_wait / sem_post

    Posté par  . Évalué à 2.

    merci pour vos réponses.
    j'ai aussi trouvé sem_wait / sem_post qui est apparemment très simple d'utilisation.

    exemple :
    - thread B bloque sur sem_wait
    - thread A empile un message et le signale à thread B en faisant sem_post, ce qui débloque B.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.