2010-07-16 20 views

risposta

4

Boost Asio lo farà abbastanza facilmente. Date un'occhiata a the examples in the Highscore tutorial, che mostra come usare Boost per input/output asincroni con multithreading.

#include <boost/asio.hpp> 
#include <boost/thread.hpp> 
#include <iostream> 

void handler1(const boost::system::error_code &ec) 
{ 
    std::cout << "5 s." << std::endl; 
} 

void handler2(const boost::system::error_code &ec) 
{ 
    std::cout << "5 s." << std::endl; 
} 

boost::asio::io_service io_service; 

void run() 
{ 
    io_service.run(); 
} 

int main() 
{ 
    boost::asio::deadline_timer timer1(io_service, boost::posix_time::seconds(5)); 
    timer1.async_wait(handler1); 
    boost::asio::deadline_timer timer2(io_service, boost::posix_time::seconds(5)); 
    timer2.async_wait(handler2); 
    boost::thread thread1(run); 
    boost::thread thread2(run); 
    thread1.join(); 
    thread2.join(); 
} 
3

vorrei provare e non utilizzare i thread in un primo momento. Vorrei iniziare con libevent. Troverete che il modello libevent è estremamente semplice e scales out way better than spawning a thread per request model. E se libevent non può gestire il tuo caso d'uso c'è sempre Erlang!

+1

Boost.Asio è perfettamente adatto anche per questo tipo di lavoro da un thread a molti client. – Staffan

2

L'I/O asincrono è migliore in molti modi rispetto al modello thread-per-client. Le prestazioni ottimali sono effettivamente ottenute da thread-per-core, con ogni thread che esegue l'I/O asincrono.

Nota che il tuo concetto di "server multithread", sebbene non esattamente sbagliato, è molto diverso da quello che tutti gli altri usano per usare quella frase. Generalmente significa un thread per connessione e non la risposta a una connessione parallela attraverso i thread.

L'esempio che si richiede è solo una combinazione di server sincrono a thread singolo + calcolo parallelo.