Boost Asio多线程TCP同步服务器

Boost Asio Multithreaded TCP Synchronous Server

本文关键字:同步 服务器 TCP 多线程 Asio Boost      更新时间:2023-10-16

我正在尝试创建一个tcp同步服务器。我的主线程将创建监听端口,传入的连接将由线程处理。

我代码:

void WorkerThread(boost::shared_ptr< boost::asio::io_service >  io_service)
{
    io_service->run();
}
void Application::server()
{
        boost::shared_ptr< boost::asio::io_service > io(
            new boost::asio::io_service()
            );
        boost::shared_ptr< boost::asio::io_service::work > work(
            new boost::asio::io_service::work(*io)
            );
        // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR
        boost::asio::ip::tcp::acceptor acceptor(*io);
        boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 2198);
        acceptor.open(endpoint.protocol());
        acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
        acceptor.bind(endpoint);
        acceptor.listen();              
        // pool of threads
        boost::thread_group worker_threads;
        for(int x = 0; x < 5; ++x)
        {
            worker_threads.create_thread(boost::bind(&WorkerThread, io));
        }
        while(true)
        {
            boost::shared_ptr< boost::asio::ip::tcp::socket > socket(
                new boost::asio::ip::tcp::socket( *io )
                );
            acceptor.accept(*socket);
            processConnection(*socket);
            socket->close();
        }
        io->stop();
        worker_threads.join_all();
}
void Application::processConnection(boost::asio::ip::tcp::socket & socket)
{
    boost::asio::streambuf request_buffer;
    std::istream request_stream(&request_buffer);
    // repsonse buffer
    boost::asio::streambuf response_buffer;
    std::ostream response_stream(&response_buffer); 
    boost::asio::read_until(socket, request_buffer, "</message>"); 
    // process request_buffer into response_buffer
    boost::asio::write(socket, response_buffer);
}

下面的操作使用多个客户端连接到服务器;但是,如果我删除线程池,它也可以工作。有人能解释一下为什么吗?我甚至需要线程池吗?

但是,如果我删除线程池,

也可以工作。谁能解释一下为什么?我甚至需要线程池吗?

对于示例代码,您不需要线程池。不需要在您的上下文中调用io_service::run(),请参阅文档

run()功能阻塞,直到所有工作完成且没有更多的处理程序被调度,或者直到io_service被调度停止。

您没有向io_service添加任何处理程序,因此不需要调用run()。如果您使用异步方法,如async_accept(),那么您将需要run() io_service

您可能会发现,如果您将boost的内容类型定义为

,那么您的代码会更容易阅读。

例子
typedef boost::asio::ip::tcp::socket TSocket;

这个没有直接的帮助,但是会有帮助