代码之家  ›  专栏  ›  技术社区  ›  The Storm

ASIO正确处理多线程+钢绞线+插座+定时器

  •  -1
  • The Storm  · 技术社区  · 4 年前

    io_context 多个线程调用 run()

    void Server::AcceptConnection()
    {
        acceptor_.async_accept(asio::make_strand(io_context_),
                [this](const asio::error_code& error, asio::ip::tcp::socket peer) {
                    if (!error) {
                        std::make_shared<Session>(std::move(peer))->run();
                    }
                    AcceptConnection();
                });
    }
    

    这里有一个精简版的 Session 班级:

    class Session : public std::enable_shared_from_this<Session>
    {
    public:
        Session(asio::ip::tcp::socket&& peer) : peer_(std::move(peer)) {}
        void run()
        {
            /*
            asio::async_read(peer_, some_buffers_, some_callback_);
            timeout_timer_.expires_after();
            timeout_timer_.async_wait();
            // etc
            */
        }
        
    private:
        asio::ip::tcp::socket peer_;
        asio::steady_timer timeout_timer_{peer_.get_executor()};
    }
    

    请注意定时器的初始化。 strand::wrap() asio::bind_executor()

    这里的问题是:

    注意:计时器用于在超时超过时中止TCP连接。

    0 回复  |  直到 4 年前
        1
  •  2
  •   sehe    4 年前

    是的,这也是我写东西的方式,使用新的接口。

    我记得当我开始使用新的接口时,我也有同样的顾虑,最后 各种完成处理程序确实在预期的串上运行,它们确实是这样。

    总的来说,这些都大大简化了库的使用。