Files de messages et multiplexage
Bonjour,
Je d�veloppe un programme multi-thread� sous Linux en C++. Un thread est dit principal, et les autres secondaires. Ces threads ont besoin de communiquer entre eux. Bien que le programme tourne sous Linux, s'il pouvait �tre portable et tourner sous Windows, �a serait un plus, mais ce n'est pas une condition stricte.
Je suis parti sur l'id�e de faire communiquer les threads secondaires avec le thread principal au moyen de files de messages. J'ai cherch� un peu les diff�rentes impl�mentations � ma disposition, et je me suis retrouv� avec :
- Boost.Interprocess : gestion classique des files, avec les op�rations d'envoi et de r�ception de type try/timed/block, en C++. Permet de g�rer la taille des files et des messages, la priorisation ;
- GLib : pareil que Boost.Interprocess, sauf qu'il n'est pas possible de limiter la taille des files ni de prioriser, en C ;
- ACE::Message_Queue : � approfondir, je me suis noy� assez rapidement dans leur documentation, g�re apparemment les notifications ;
- mq_*(7) : impl�mentation POSIX des files, possibilit� de travailler directement sur des descripteurs de fichiers.
Suivant l'impl�mentation, si mon thread principal doit se mettre en attente de messages provenant de diff�rentes files, je vois deux fa�ons de proc�der (s'il en existe d'autres, je compte sur vous pour me les pr�ciser ;)) :
- Bloquant : on se met en attente sur l'ensemble des files, d�s qu'un message arrive, il est trait�. Je ne vois que l'impl�mentation mq_*(7) qui me permette d'y parvenir, mais est-ce vraiment portable ? ;
- Non bloquant : on teste chaque file l'une apr�s l'autre pour voir si un message est disponible. Je trouve �a assez lourd et co�teux en temps CPU, mais �a a le m�rite de tourner sur diff�rentes plate-formes.
En partant sur l'hypoth�se de gestion bloquante de mes files (donc utiliser mq_*(7)), et ne voulant pas r�inventer la roue � chaque fois (c'est � dire utiliser select(2) ou epoll(7) directement)), je m'imaginais utliser une event_loop telle que celle propos�e par la GLib ou la libevent. Et c'est l� que je suis bloqu� (sans mauvais jeu de mots) : je ne peux pas utiliser les m�thodes d'un objet comme handler. Je suis (apparemment ?) forc� d'utiliser une fonction C, ce qui ne m'arrange pas vraiment...
Bref, pour les plus t�m�raires qui ont r�ussi � lire jusque l�, je suis un peu dans le flou, et aurais besoin de quelques �claircissements :
- La gestion non bloquante des files est-elle un faux probl�me en terme de performance ?
- Comment faire coucher une gestion bloquante de files avec le C++ ?
- Existe-t-il des syst�mes de notification d'arriv�e de messages que je ne connais pas ?
Voil�, j'esp�re avoir �t� � peu pr�s clair, n'h�sitez pas � me demander d'autres informations si vous avez besoin !
Merci,
Florian