处理提升asio计时器取消

时间:2018-04-23 18:52:26

标签: c++ boost boost-asio

考虑以下使用async connect模拟带超时的同步连接的代码:

{
    boost::asio::steady_timer timer{io_service, timeout};
    timer.async_wait([&socket](boost::system::error_code const& code) {
        if (!code)
            socket.close();
        });

    auto future = boost::asio::async_connect(socket, endpoint, boost::asio::use_future);
    future.get();
}

/* detect post-success cancelation? */
if (!socket.is_open()) {
}

如果我正确理解了asio文档,我不能保证在is_open()已经返回true之后定时器处理程序不会关闭套接字,因为这样的事件序列是可能的:

  1. 连接成功完成
  2. 计时器到期,使用代码== success
  3. 对处理程序进行排队
  4. 计时器已销毁,但已排队的处理程序无法调用
  5. is_open()返回true,所以我们认为我们是黄金
  6. 处理程序运行,取消我们的套接字,因为代码==成功
  7. 使用套接字的未来操作失败,因为我们错误地认为它仍处于打开状态
  8. 如何修复此代码以防止出现这种情况?

0 个答案:

没有答案