c++ - ASIO 正确处理多线程 + strand + socket + timer

标签 c++ server boost-asio 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 连接。

最佳答案

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

我记得当我开始使用新界面时也有同样的担忧,并最终检查各种完成处理程序确实在预期的链上运行,他们确实这样做了。

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

关于c++ - ASIO 正确处理多线程 + strand + socket + timer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64030177/

相关文章:

c++ - IplImage 与 CvMat

c++ - Visual C++ 和 gcc 之间从 std::isblank 返回的结果不一致。哪一个是错误的?

c++ - 在 C++ 中执行复杂的 shell 命令的正确方法是什么?

c++ - boost Asio 套接字问题

c++ - boost::asio::async_write() 与 boost::asio::write()

android - Asio 或 Boost.Asio 可以在 iPhone 或 Android 上运行吗?

c++ - 解析 double 的普通 python 列表

web-services - 优点和缺点 - 在同一台服务器上运行(预定)后台任务和 Web 请求处理

c++ - tcp 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据

server - 通过文件客户端连接到远程服务器