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