boost asio - 会话线程没有结束

时间:2012-01-29 09:45:26

标签: c++ networking boost boost-asio

我使用boost asio来处理每个线程的会话,如下所示:

Server::Server(ba::io_service& ioService, int port): ioService_(ioService), port_(port)
{
    ba::ip::tcp::acceptor acceptor(ioService_, ba::ip::tcp::endpoint(ba::ip::tcp::v4(), port_));
    for (;;)
    {
        socket_ptr sock(new ba::ip::tcp::socket(ioService_));
        acceptor.accept(*sock);
        boost::thread thread(boost::bind(&Server::Session, this, sock));
    }
}

void Server::Session(socket_ptr sock)
{
    const int max_length = 1024;
    try
    {
        char buffer[256] = "";
        // HandleRequest() function performs async operations
        if (HandleHandshake(sock, buffer))
          HandleRequest(sock, buffer);

        ioService_.run(); 
    }
    catch (std::exception& e)
    {
      std::cerr << "Exception in thread: " << e.what() << "\n";
    }

    std::cout << "Session thread ended \r\n"; // THIS LINE IS NEVER REACHED
}

在Server :: Session()中,我在某些时候使用async_read_some()和async_write()函数执行async io。 一切正常,为了使其工作,我必须在我的spawn线程中调用ioService_.run(),否则Server :: Session()函数退出并且它不处理所需的io工作。

问题是从我的线程调用的ioService_.run()将导致线程根本不退出,因为同时其他请求来到我的侦听服务器套接字。

我最终得到的是线程启动和处理现在的会话但从不释放资源(结束)。使用这种方法时,是否可以只使用一个boost :: asio :: io_service?

2 个答案:

答案 0 :(得分:1)

我相信您正在寻找run_one()poll_one()这将允许您让线程执行就绪处理程序(poll)或等待处理程序(运行)。通过只处理一个,您可以选择在退出线程之前执行多少。与执行所有处理程序的run()相反,直到io_service停止。 poll()在处理完所有当前准备好的文件后停止的地方。

答案 1 :(得分:0)

我在这里构建处理连接的方式很糟糕。 关于如何设计你的asio服务器(由asio创建者制作)有一个很好的视频演示 Thinking Asynchronously: Designing Applications with Boost Asio