【问题标题】:How to cancel all asynchronous operations in single thread of Boost asio multithread server?如何取消Boost asio多线程服务器单线程中的所有异步操作?
【发布时间】:2020-02-03 22:25:01
【问题描述】:

我想实现服务器的单线程终止,允许继续执行 其他线程的操作(接受、读取、写入)。 我应该为每个线程使用自己的接受器对象吗? 是否存在 api 功能或者我应该实现套接字注册,我将在哪里标记,哪个套接字属于线程? 目前,我实现了该线程的循环:

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);
}

【问题讨论】:

  • 您是否正在尝试实现每个客户端都有自己的线程来处理该客户端的接受/读/写的解决方案,或者您是否可以接受一个线程能够处理来自多个客户端的请求?
  • 我的解决方案是几个线程和每个线程中的几个客户端。

标签: c++ boost-asio


【解决方案1】:

只有当取消意味着停止时:io_context::stop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2013-09-20
    • 2013-03-30
    相关资源
    最近更新 更多