看完这些...
Cancelling boost asio deadline timer safely
Atomically cancel asio asynchronious timer from another thread
...我想尝试对用法进行澄清。
对于第一个引用的问题,在计时器到期后但在其处理程序运行之前取消计时器无效。这样的“运行中”计时器的处理程序仍然可以正常运行。
这带来了一个生命周期问题。一种常见的用法模式是使计时器成为类的成员,并使计时器的到期处理程序引用该父类。父类可以从其析构函数中取消计时器,但在上述情况下似乎会发生崩溃,因为在处理程序运行时,计时器和父类都不再存在。
如果确实是这样,如何解决?我们可以在处理程序中将std :: weak_ptr捕获到父类并在继续之前进行检查,但是并非每个父类都可以通过std :: shared_ptr管理其生命周期。
答案 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
通知您它已被取消,并据此决定下一步行动。