2010-07-16 10 views

Antwort

4

Boost Asio wird dies ganz einfach tun. Werfen Sie einen Blick auf the examples in the Highscore tutorial, die zeigt, wie Boost für asynchrone Eingabe/Ausgabe mit Multithreading verwendet wird.

#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

Ich würde versuchen, und Threads zunächst nicht verwenden. Ich würde mit libevent beginnen. Sie werden feststellen, dass das Libevent-Modell sehr einfach ist und scales out way better than spawning a thread per request model. Und wenn Libevent Ihren Anwendungsfall nicht bewältigen kann, gibt es immer Erlang!

+1

Boost.Asio eignet sich auch perfekt für diese Art von Ein-Thread-zu-Viele-Clients. – Staffan

2

Asynchronous I/O ist in mancher Hinsicht besser als das Thread-pro-Client-Modell. Die optimale Leistung wird tatsächlich durch Thread-pro-Core erreicht, wobei jeder Thread asynchrone I/O ausführt.

Beachten Sie, dass Ihr Konzept von "Multithread-Server", obwohl nicht genau falsch, ist ganz anders als das, was alle anderen diesen Begriff zu verwenden bedeutet. Im Allgemeinen bedeutet dies einen Thread pro Verbindung und nicht die Antwort auf eine Verbindung, die über Threads parallelisiert ist.

Das Beispiel, nach dem Sie fragen, ist nur eine Kombination aus single-threading synchronem Server + paralleler Berechnung.