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 NeoX . Évalué à 3.
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 jcs (site web personnel) . Évalué à 3.
# C'est déjà prévu
Posté par Sylvain Sauvage . Évalué à 4.
man msgget
man msgsnd
man msgrcv
Conformité POSIX.1-2001 (ça fonctionne sous Unix, Linux, BSD, Windows NT…)
# sem_wait / sem_post
Posté par goeb . Évalué à 2.
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.
[^] # Re: sem_wait / sem_post
Posté par mathieu mathieu (site web personnel) . Évalué à 1.
Je te propose de regarder les fonctions de mutex et surtout de cond_wait...
http://www.llnl.gov/computing/tutorials/pthreads/#ConditionV(...)
un exemple d'implementation est dispo dans la lib libapr-utils:
http://apr.apache.org/docs/apr-util/1.2/group___a_p_r___util(...)
[^] # Re: sem_wait / sem_post
Posté par left . Évalué à 3.
Ceci dit:
- avec les fonctions pthread_mutex_* et pthread_cond_* , tu refais une implémentation de sémaphore
- mais les fonctions sem* sont franchement bugguées sous Linux
Donc je te plussoie largement: il faut utiliser les mutex et cond de pthread.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.