2012-12-18 151 views
1

我跟隨boost-asio tutorial,不知道如何使用boost提高多線程服務器。我編譯並測試了daytime clientdaytime synchronous server並改進了通信(服務器向客戶端請求一個命令,處理它並將結果返回給客戶端)。但是這個服務器一次只能處理一個客戶端。多線程升壓 - asio服務器(VS升壓異步服務器教程)

我想用boost來創建一個多線程服務器。還有daytime asynchronous server它執行

boost::asio::io_service io_service; 
tcp_server server(io_service); 
io_service.run(); 

在主程序功能。問題是 - 爲每個客戶端內部的每個客戶創建一個線程是否提升?這是一個多線程解決方案嗎?如果沒有 - 如何使用提升來創建多線程服務器?感謝您的任何建議。

回答

2

看看this教程。在短期方面:

  • io_service.run()在多線程提供了一個線程池
  • 多個io_services給完全分開的螺紋
2

你不需要的時候要明確使用線程支持多個客戶端。但爲此,您應該使用異步調用(與您在列出的教程中使用的同步相反)。看看asynchronous echo tcp server示例,它可以在不使用線程的情況下爲多個客戶端提供服務。

is boost creating a thread for each client somewhere inside? 

當異步調用工作,使ASIO是做幕後的這些東西。它可以使用線程,但通常不會因爲同時使用多個套接字而有其他首選機制。例如,在Linux上,您有epoll,selectpoll(按優先順序排列)。我不確定窗口上的情況,可能有其他機制或偏好順序可能不同。但無論如何,boost asio會照顧到這一點,爲您的平臺選擇最佳的機制,並將其隱藏在異步調用之後。

+0

感謝您的回覆。如何支持多個客戶端不使用線程呢? – ducin

+0

嘗試編譯並運行[異步回顯tcp服務器示例](http://www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/example/echo/async_tcp_echo_server.cpp)。然後嘗試一次運行多個客戶端(您可以使用[synchronous ones](http://www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/example/echo/blocking_tcp_echo_client.cpp)),你會看到服務器將能夠同時處理所有的客戶端。讓我知道你什麼時候放棄它,而你不明白這件事。 –