2012-12-18 143 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)),你会看到服务器将能够同时处理所有的客户端。让我知道你什么时候放弃它,而你不明白这件事。 –