ASIO计时器取消和生命周期问题

时间:2019-05-17 17:20:40

标签: boost-asio asio

看完这些...

Cancelling boost asio deadline timer safely

Atomically cancel asio asynchronious timer from another thread

...我想尝试对用法进行澄清。

对于第一个引用的问题,在计时器到期后但在其处理程序运行之前取消计时器无效。这样的“运行中”计时器的处理程序仍然可以正常运行。

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

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

1 个答案:

答案 0 :(得分:0)

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

当我们取消计时器时,无论计时器是否到期,它的处理程序或未决的等待者都将运行,并且看起来它们都以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通知您它已被取消,并据此决定下一步行动。