Как отменить все асинхронные операции в одном потоке многопоточного сервера Boost asio? - PullRequest
1 голос
/ 04 февраля 2020

Я хотел бы реализовать однопоточное завершение работы сервера, позволяющее продолжить выполнение операций (принять, прочитать, записать) для других потоков. Должен ли я использовать собственный объект акцептора для каждого потока? Существует ли API-функциональность для этого или я должен реализовать регистр сокетов, где я буду отмечать, какой сокет принадлежит потоку? В настоящее время я реализую l oop:

void TServer::Process_connections(IThread* _th, TThcode _idx)
{
    const char * FUNCTION = __FUNCTION__;
    using namespace boost::asio::ip;
    using namespace boost::asio;
    error_code ec;
    LOG + "s: server thread loop is started" << std::to_string(_idx);
    //auto m_pthread = m_pmngthread.get();
    auto isRunning = _th->isRunning();//m_pthread->isRunning();
    while(isRunning)
    {
        if ((m_state(state::running)))
        {
            do_accept(_idx);
            //m_state << state::run;
            break;
        }
        isRunning = _th->isRunning();
    }
    while(isRunning)
    {
        if (m_state(state::run))
        {
            try
            {
                m_ioservice.poll(ec);
            } catch (...)
            {
                errspace::show_errmsg(FUNCTION);
                m_state << state::shutdowned;
            }
            if (ec) break;
            clearGarbage();
        }

        isRunning = _th->isRunning();//m_pthread->isRunning();
    }
    LOG << "s: server thread loop is stopping";
    // only for single thread server
    m_acceptor.cancel(ec);
    if (ec)
    {
        errspace::show_errmsg("error in acceptor::cancel");
    }
    // only for single thread server
    m_ioservice.run(ec);
    if (ec)
    {
        errspace::show_errmsg("error in ioservice::run");
    }
    std::unique_lock<std::recursive_mutex>  lock(m_mtx_garbage);
    std::unique_lock<std::recursive_mutex>  lock2(m_mtx_active);
    m_socketset_garbage.clear();
    m_socketset_active.clear();
    // only for single thread server
    m_acceptor.close();
    if (ec)
    {
        errspace::show_errmsg("error in acceptor::close");
    }
    LOG + "s: loop is stopped" << std::to_string(_idx);
}
этого потока

1 Ответ

0 голосов
/ 04 февраля 2020

Только если под отменой вы подразумеваете остановку: io_context :: stop

...