继续提升 asio io_service

Keep boost asio io_service

我通常为整个应用程序保留一个 io_service 对象,并使用多个线程对其调用 运行。创建套接字或定时器通过引用使用 io_service。当所有线程都在应用程序退出时完成时会发生什么,假设在 tcp 套接字上调用了关闭或取消操作。 io_service 不再可用。将 io_service 传递给任何与 asio 相关的分类时是否存在 io_service 的副本,或者是否存在未定义的行为?

从来没有 io_service 的副本(或更新的 io_context 取代已弃用的 io_service)。那是因为它不可复制。

如果在异步操作尚未完成时不维护生命周期,则行为确实是未定义的。但是,通过强制停止服务以优雅地等待它完成任何未决操作,确保不会发生异步 operations/completions 并不难。

对于生产质量代码,我建议采用后一种方法。