是否通过链调用 ASIO 完成处理程序以取消操作?

Posted

技术标签:

【中文标题】是否通过链调用 ASIO 完成处理程序以取消操作?【英文标题】:Are ASIO completion handlers invoked through the strand for cancelled operations? 【发布时间】:2016-12-08 21:51:09 【问题描述】:

假设有一个挂起的异步操作,当它被取消时,它的完成处理程序被一个链包裹 - 例如通过关闭套接字、取消计时器等。

因此,正如我所见,完成处理程序将与错误代码 operation_aborted 一起排队。现在它们可以通过io_service 出列以进行调度。

我讲这个故事的方式对吗?如果是这样,当io_service 调用完成处理程序时,即使它们是取消操作的结果,它是否也会通过链执行?

【问题讨论】:

【参考方案1】:

是的,当然。每个启动的异步操作都完成是一个不变量。无论错误代码或成功,完成处理程序都以相同的方式执行——如果它被链包裹,则处理程序将在链上执行。

在这种情况下,通常您不需要做任何事情,处理程序只检查operation_abortedreturns。但如果你想做任何事,你可以。此外,回调对象的破坏可能会导致事情发生。例如,如果完成处理程序的调用是通过 shared_ptr 进行的,则 shared_ptr 的销毁可能会触发其他析构函数运行。

【讨论】:

以上是关于是否通过链调用 ASIO 完成处理程序以取消操作?的主要内容,如果未能解决你的问题,请参考以下文章

安全地完成读取操作 (Boost.Asio)

关于何时在 Boost.Asio 中调用处理程序

如果调用 asio::strand 的析构函数时,该链上仍有一些就绪/未就绪的处理程序怎么办?

boost::asio 学习

如果用户按下取消,UIActivityViewController 完成处理程序仍会调用操作

Boost Asio总结异步通信