2010-02-03 9 views
5

... per l'utilizzo in un server di rete con multithreading.Ricerca di una libreria C o C++ che fornisce una funzionalità simile ai canali di Google Go

Voglio passare i dati tra più thread. Attualmente sto usando i socket, con il blocco del master thread su select() e il blocco dei worker su recv(), sebbene ritenga che probabilmente ci siano modi più avanzati o preconfezionati di gestire questa attività in C++.

+0

c'è un motivo per cui il recv sta bloccando? non pensavo dovessi bloccare per recv, lo stesso potrebbe essere vero per selezionare – matt

+0

Questo non è un bug. Blocca su recv() quando è in attesa di dati dal thread principale. L'ho solo detto per spiegare meglio l'architettura del programma. – lzm

+1

Felice di vedere che non sono l'unico ad apprezzare i "canali". –

risposta

4

avrei thread di lavoro in attesa in un pool di thread.

Quindi il master in attesa di selezione (sia per le letture che per le scritture).

All'arrivo dei dati, il master aggiunge lavori al pool di thread. All'aggiunta di ogni lavoro, un thread si riattiva esegue il lavoro e ritorna al pool. In questo modo non blocchi i thread in attesa su porte specifiche con recv() e un set fisso di thread figlio può gestire tutto il traffico in entrata.

librerie correntel che supportano questa funzionalità negli oggetti già pronti:

2

È possibile provare la libreria ACE fornita con pipe e code di messaggi che sono particolarmente adatte per la comunicazione tra thread.

** ACE sta per Adaptive Communication Environment *

2

libthread da plan9port comprende una struct canale che sarà molto simile ; prendere atto del contributo di Russ Cox sia plan9port e di go-Lang, e la libthread history:

Muoversi in una direzione diversa, Luca Cardelli e Rob Pike sviluppati le idee in CSP nel Squeak mini-lingua [4] per la generazione del codice di interfaccia utente . (Questo Squeak è distinto dall'implementazione Squeak Smalltalk .) Pike successivamente espanse Squeak nel linguaggio di programmazione completo Newsqueak [5] [6] che generò Alef di Plan 9 [7] [8], Inferno's Limbo [9] e Google's Go [13].

In un momento successivo nella storia del Plan 9, è diventato troppo sforzo per mantenere l'infrastruttura per due lingue, in modo da Alef è stato interrotto e il CSP costruisce portato su C sotto forma di libthread.

Quindi, poiché i canali Go sono essenzialmente un discendente diretto da libthread, non credo che troverete qualcosa di più simili :)

0

"Un canale è una coda tamponato o senza buffer per fisso messaggi di dimensioni "(plan9 thread).
C'è una coda bufferizzata nel TBB: concurrent_bounded_queue.
E ho appena implementato una sorta di canale non bufferizzato in C++ 11: https://gist.github.com/ArtemGr/7293793.Sebbene un'implementazione più generica sia quella di creare una coppia di riferimenti (come nel Felix mk_ioschannel_pair), una per ciascun endpoint del canale, in modo da interrompere qualsiasi attesa nel caso in cui l'altra estremità del canale non esista più.

0

Forse vale la pena provare ZeroMQ. Ha un canale 'inproc' che ti permette di comunicare tra i thread. Naturalmente, puoi solo inviare stringhe tra thread, non oggetti, ma d'altra parte supporta altri trasporti come TCP/IP (in modo che tu possa facilmente comunicare tra processi su una rete), sia multipiattaforma e abbia binding di linguaggio per la maggior parte di corrente le lingue.

Problemi correlati