拥有特定于实例的io_service、解析器等可以 VS 在每个函数中创建它们

Having instance specific io_service, resolver etc is okay VS creating them in every function?

本文关键字:VS 创建 函数 于实例 实例 service io 拥有      更新时间:2023-10-16

我正在尝试使用boost::asio编写自己的异步网络客户端。我在可用示例中观察到的一件事是,对于是创建单个io_service、解析器和查询对象,还是为我正在创建的每个连接创建这些对象的新实例,都不清楚。

我有一个客户端,它只会联系特定的服务器(唯一的IP和主机),但每天会这样做100次。

我计划拥有自己的网络类,并且在类本身中,我在构造对象时设置了io_service、解析器、查询和套接字变量。

myclient::myclient() : io_service_(), resolver_(io_service_),
  query_(tcp::v4(), host_, port_), socket_(io_service_) 
{
}
//...
resolver.async_resolve_();
io_service_.reset();
io_service_.run_one();

这看起来还行吗?

您应该

尝试将自己限制为一个io_service,因为上面描述的进程io_service类是线程安全的,因此可以同时被许多线程用于调度工作。 快速阅读io_service类文档,其中底部有一些使用示例。

另请查看聊天客户端示例,并注意如何在 main 函数中创建io_service,然后通过引用传递给 chat_client 类。