【问题标题】:ASIO timer cancellation and lifecycle questionASIO 定时器取消和生命周期问题
【发布时间】:2019-05-17 17:20:39
【问题描述】:

看完这些……

Cancelling boost asio deadline timer safely

Atomically cancel asio asynchronious timer from another thread

...我想尝试澄清一下用法。

根据第一个引用的问题,在计时器过期但在其处理程序运行之前取消计时器是行不通的。这种“飞行中”计时器的处理程序仍然正常运行。

这带来了一个生命周期问题... 一个常见的使用模式是让计时器成为类的成员,并让其到期处理程序引用该父类。父类可以从其析构函数中取消计时器,但在上述情况下似乎存在崩溃风险,因为在处理程序运行时计时器和父类都不再存在。

如果确实如此,如何解决?我们可以在处理程序中将 std::weak_ptr 捕获到父类并在继续之前对其进行检查,但并非每个父类都可以通过 std::shared_ptr 管理其生命周期。

【问题讨论】:

    标签: boost-asio asio


    【解决方案1】:

    以下是我基于 Net.ts 而非 ASIO 的观察——我相信它们之间不会有任何根本性的变化。

    当我们取消计时器时——不管它是否过期,它的处理程序或 pending_waiter 都会运行,看起来,它们都在运行时将 error_code 设置为

    op->ec_ = std::experimental::net::v1::error::operation_aborted;
    

    所以,据我了解,您的第二个问题是:如果我在一个类中有一个计时器对象,并且由于某些原因属于该类的对象的析构函数运行并取消计时器(?)

    在异步编程(特别是使用回调建立的编程)中,传递给处理程序的 error_code 参数起着重要作用。

    因此,在您的情况下,我相信您可以使用

    来克服所谓的“崩溃风险”
    if(ec == std::experimental::net::v1::error::operation_aborted)
         LOG(....) or return;
    

    编辑:如果您的问题是我们如何管理对象的生命周期,那么我可以说有多种方法可以做到这一点,但我想通过我的评论提出的一点是,每当取消计时器对象时,它会通过ec 通知您它已被取消,并据此决定您的下一步行动。

    【讨论】:

      猜你喜欢
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      相关资源
      最近更新 更多