2012-06-13 15 views
7

Non ho molta esperienza in boost::asio. Ho alcune domande piuttosto elementari.Abbiamo bisogno di più io_service per thread per boost filettato :: server asio con un singolo accettore

ho bisogno di avere un diverso io_service, e un diverso socket sotto un diverso thread ma un unico acceptor, per elaborare un cliente in un server filettato?

Credo di avere un socket diverso per un nuovo client. Ma se tutti i thread usano lo stesso io_service sarebbe parallelo?

Stavo passando attraverso http://en.highscore.de/cpp/boost/index.html nella sezione asio che dice che ho bisogno di avere diversi io_services in thread diversi per ottenere la parallelizzazione.

I se ho intenzione di fare una classe server che crea un new TCPsession ogni volta che un nuovo cliente viene visualizzato nella acceptor.async_accept
e TCPSession ctor crea un io_service e un thread e corre che io_service.run() nel proprio thread sarebbe un buon progetto ?

Tuttavia in questo progetto dovrei unirmi a tutti questi thread? ho bisogno di un altroper main in modo che non termini ancora prima di ottenere un nuovo Cliente?

risposta

8

Singolo io_service eseguito in un singolo thread può servire tutti gli oggetti asio nel progetto. In un tale progetto l'I/O sarebbe ancora "parallelo" nel senso che non è bloccante, asincrono; ma poiché io_service::run() viene eseguito in un singolo thread, tutti i gestori di completamento verranno invocati in serie, uno per uno.

Per scalare il modulo di rete su più CPU, è possibile utilizzare uno dei due approcci: thread-per-core, io_service-per-core - vedere HTTPServer2 and HTTPServer3 examples.

In ogni caso, la creazione di un filo o io_service per TCPSession mi sembra un inutile sovraccarico - pensare a un caso in cui hai migliaia di TCPSession s ...

+0

allora che cosa la per le discussioni della sessione fare? per esempio. non dovrei avere una sessione in un thread? per rendere ogni sessione parallela? Comunque dovrei avere <5 sessioni simultanee contemporaneamente. Anche se mi piacerebbe conoscere la soluzione generica –

+0

No, non è necessario. Leggi quanto segue: http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/overview/core/async.html. L'unico caso in cui potresti aver bisogno di thread aggiuntivi è se i gestori di completamento di TCPSession sono troppo pesanti (ad esempio, eseguono operazioni DB che richiedono molto tempo). Ma poi la tua applicazione non sarebbe scalabile in ogni caso, quindi dovresti cambiare il progetto per dividere o spostare un lavoro fuori dai gestori di completamento. –

+0

Quindi se ho solo un socket diverso per sessione andrà bene? e posso prima sviluppare tutto in thread singolo? e quindi passare a più thread? –

Problemi correlati