我这么大个io_service去哪里了
最近稍微闲了下来,开始debug Boost.Asio 析构时崩溃的问题。在目前代码中,使用到了deadline_timer作定时器。
由于早期仅用简单的定时器,也就没多了解io_service的用法,简单地在每个短周期业务实例中各开了一组thread和io_service来挂deadline_timer。后来出现了一个问题,运行时发现在析构业务实例时delete io_service偶尔会崩溃(具体定位过程就不在这边展开了),就去看了源代码和reference。
想着这么大的库api应该不会有太大的变化,点开boost最新版(1.71)reference,咦 O__O 我这么大个io_service去哪里了?

Implemented interface changes to reflect the Networking TS (N4656).
- See the list of new interfaces and, where applicable, the corresponding old interfaces that have been superseded.
- The service template parameters, and the corresponding classes, are disabled by default. For example, instead of
basic_socketwe now have simplybasic_socket. The old interface can be enabled by defining theBOOST_ASIO_ENABLE_OLD_SERVICESmacro.
为了迎合C++ Networking TS的标准将接口改了,但是旧的接口依然还在支持。但一些service模板和相应的类默认不支持老版本,不过可以打开BOOST_ASIO_ENABLE_OLD_SERVICES宏来支持老版本service。
以下仅列了一些我感兴趣的修改,完整版可以看上文的list链接。
| New interface | Old interface | Notes |
|---|---|---|
io_context | io_service | The name io_service is retained as a typedef. |
dispatch | io_service::dispatch | The dispatch free function can be used to submit functions to any Executor or ExecutionContext. |
post | io_service::post | The dispatch free function can be used to submit functions to any Executor or ExecutionContext. |
defer | io_service::post when the asio_handler_is_continuation hook returns true | The defer free function can be used to submit functions to any Executor or ExecutionContext. |
io_context::poll | io_service::poll overload that takes error_code& | The error_code overload is not required. |
io_context::poll_one | io_service::poll_one overload that takes error_code& | The error_code overload is not required. |
io_context::run | io_service::run overload that takes error_code& | The error_code overload is not required. |
io_context::run_one | io_service::run_one overload that takes error_code& | The error_code overload is not required. |
io_context::run_for, io_context::run_until, io_context::run_one_for, and io_context::run_one_until | These functions add the ability to run an io_context for a limited time. | |
io_context::restart | io_service::reset | |
execution_context, execution_context::service, and execution_context::id | io_service, io_service::service, and io_service::id | The service-related functionality has been moved to the execution_context base class. This may also be used as a base for creating custom execution contexts. |
make_service | add_service | |
strand | io_service::strand | This template works with any valid executor, and is itself a valid executor. |
executor_work_guard and make_work_guard | io_service::work | Work tracking is now covered by the Executor requirements. These templates work with any valid executor. |