boost asio - сеанс потока не заканчивается - PullRequest
1 голос
/ 29 января 2012

Я использую 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 io, используя функции async_read_some () и async_write ().Все работает хорошо, и для того, чтобы это работало, мне нужно вызвать ioService_.run () внутри моего потока вызова, в противном случае функция Server :: Session () завершается, и она не обрабатывает требуемую работу ввода-вывода.

Проблема в том, что ioService_.run (), вызванный из моего потока, приведет к тому, что поток вообще не закроется, потому что в то же время другие запросы приходят к моему сокету прослушивающего сервера.

В результате я получаю потоки, запускающие и обрабатывающие сеансы, но никогда не освобождающие ресурсы (заканчивающиеся).Можно ли использовать только один boost :: asio :: io_service при использовании этого подхода?

Ответы [ 2 ]

1 голос
/ 30 января 2012

Я полагаю, что вы ищете run_one() или poll_one(), это позволит вам либо выполнить готовый обработчик (опрос), либо дождаться обработчика (запустить). Работая только с одним, вы можете выбрать, сколько выполнить, прежде чем выходить из потока. В отличие от run(), который выполняет все обработчики, пока io_service не будет остановлен. Где, как poll() остановится после того, как обработает все те, которые в данный момент готовы.

0 голосов
/ 05 февраля 2012

Способ, которым я структурировал обработку соединений здесь, был плохим. Ниже приведена довольно хорошая видео презентация о том, как спроектировать сервер asio (автор asio creator). Асинхронное мышление: разработка приложений с помощью Boost Asio

...