1. 使用timer时timer析构会导致定时器回调提前被触发


错误例子:

  1. // 错误案例:
  2. {
  3. asio::steady_timer timer(io_ctx);
  4. timer.expires_from_now(10s);
  5. timer.async_wait([](){
  6. // Do your stuff.
  7. });
  8. } // timer出了这里就会被析构,析构函数中会提前执行callback逻辑.

改进后:

  1. auto timer = std::make_shared<asio::steady_timer>(*io_ctx_);
  2. timer->expires_from_now(timeout);
  3. timer->async_wait([timer /* Avoid timer dead. */](const asio::error_code& ignored) {
  4. // Do your stuff.
  5. });

2. timer中逻辑会在异步线程执行,确保timeout后回调中捕获的对象的声明周期