ASIO正确处理多个线程+线程+套接字+计时器

问题描述

我正在使用最新的ASIO版本(截至目前为1.18.0)。当前正在设计一个带有计时器(用于超时)的多线程异步TCP服务器。我只有一个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连接,并在与TCP连接所使用的同一链中使用计时器吗?

注意:如果超时,计时器将用于终止TCP连接。

解决方法

是的,这也是我使用新界面编写东西的方式。

我记得当我开始使用新界面并结束检查时,他们也有同样的担忧。

总而言之,这些都大大简化了库的使用。