2010-02-03 12 views
5

... pour une utilisation dans un serveur de réseau multithread.Vous cherchez un C ou la bibliothèque C fournissant une fonctionnalité similaire aux canaux de Google Go

Je veux transmettre des données autour entre plusieurs threads. Actuellement j'utilise des sockets, avec le thread maître bloquant sur select() et les travailleurs bloquant sur recv(), bien que je pense qu'il y a probablement des façons plus avancées ou pré-empaquetées de gérer cette tâche en C++.

+0

Y a-t-il une raison pour laquelle recv bloque? Je ne pensais pas que vous deviez bloquer à recv, même peut-être vrai pour sélectionner – matt

+0

Ce n'est pas un bug. Il bloque sur recv() lorsqu'il attend des données du thread principal. Je l'ai seulement dit pour mieux expliquer l'architecture du programme. – lzm

+1

Content de voir que je ne suis pas le seul à apprécier les "canaux". –

Répondre

4

j'aurais threads de travail en attente dans un pool de threads.

Alors le maître en attente sur une sélection (pour les lectures et écritures).

Comme données vient le maître ajoute des emplois à la piscine de fil. Au fur et à mesure que chaque travail est ajouté, un thread se réveille, exécute le travail et retourne dans le pool. De cette façon, vous ne bloquez pas les threads qui attendent sur des ports spécifiques avec recv() et un ensemble fixe de threads enfants peut gérer tout le trafic entrant.

libs currentl qui prennent en charge cette fonctionnalité dans des objets prêts à l'emploi:

2

Vous pouvez essayer la bibliothèque ACE qui est livré avec des tuyaux et des files d'attente de messages qui sont spécialement adaptés pour la communication inter-thread.

** ACE signifie pour l'environnement Communication Adaptive *

2

libthread de plan9port comprend un struct canal qui sera très similaire ; prendre note de la contribution de Russ Cox à la fois plan9port et aller-lang et le libthread history:

Déplacement dans une autre direction, Luca Cardelli et Rob Pike développé les idées CSP dans le mini-langage Squeak [4] pour générer le code d'interface utilisateur . (Ce Squeak est distinct de l'implémentation de Squeak Smalltalk .) Pike a ensuite étendu Squeak dans le langage de programmation à part entière Newsqueak [5] [6] qui a engendré le Alef de Plan 9 [7] [8], Limbes de l'enfer [9] , et Google's Go [13].

ultérieurement dans l'histoire du Plan 9, il est devenu trop d'efforts pour maintenir l'infrastructure pour deux langues, Alef a été interrompu et le CSP construit à C porté sous forme de libthread.

Ainsi, puisque les canaux go sont essentiellement un descendant direct de libthread, je ne pense pas que vous trouverez quelque chose plus similaire :)

0

"Un canal est une file d'attente bufferisés ou non pour fixe messages de taille "(plan9 thread).
Il y a une file d'attente tamponnée dans le TBB: concurrent_bounded_queue.
Et je viens de genre mis en place un canal unbuffered en C++ 11: https://gist.github.com/ArtemGr/7293793.Bien qu'une implémentation plus générique serait de créer une paire de références (comme dans le Felix mk_ioschannel_pair), un pour chaque point d'extrémité du canal, afin d'interrompre toute attente dans le cas où l'autre extrémité du canal n'existe plus.

0

Peut-être ZeroMQ pourrait être intéressant de vérifier. Il a un canal 'inproc' qui vous permet de communiquer entre les threads. Bien sûr, vous ne pouvez envoyer des chaînes qu'entre des threads et non des objets, mais d'un autre côté, il prend en charge d'autres transports comme TCP/IP (vous pouvez facilement communiquer entre les processus sur un réseau). langues.