是否通过链调用 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_aborted
和return
s。但如果你想做任何事,你可以。此外,回调对象的破坏可能会导致事情发生。例如,如果完成处理程序的调用是通过 shared_ptr
进行的,则 shared_ptr
的销毁可能会触发其他析构函数运行。
【讨论】:
以上是关于是否通过链调用 ASIO 完成处理程序以取消操作?的主要内容,如果未能解决你的问题,请参考以下文章
如果调用 asio::strand 的析构函数时,该链上仍有一些就绪/未就绪的处理程序怎么办?