gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:04:04 27 4
gpt4 key购买 nike

如果 asio::strand 的析构函数被调用,这条链上还有一些就绪/未就绪的处理程序吗?

根据文档:

Handlers posted through the strand that have not yet been invoked will still be dispatched in a way that meets the guarantee of non-concurrency.



这是否意味着它仍然会调用所有的处理程序,包括等待未就绪的处理程序准备好,就好像它没有被销毁一样(可能除了不接受新的处理程序)?

或者我对“未就绪的处理程序”在概念上是错误的——异步操作在完成之前不会将其处理程序发布到链上?如果调用了目标链的析构函数,这个异步操作会意识到这一点吗?

最佳答案

来自 documentation :

Handlers posted through the strand that have not yet been invoked will still be dispatched in a way that meets the guarantee of non-concurrency.



基本上,一个 strand可以被认为是关联的,但不拥有处理程序队列。如果处理程序队列当前没有处理程序发布到 io_service ,然后它会从自身弹出一个处理程序并将其发布到相关的 io_service .此流程保证处理程序发布到同一个 strand不会同时调用。

所有处理程序发布到 strand被认为可以运行。因此, strand 缺乏完成条件。 API。当 strand s 用于异步操作, initiating function通常提供从 strand::wrap() 返回的处理程序:

async_op(..., s.wrap(a));

async_op()完成后,它将调用从 s.wrap(a) 返回的处理程序.然后,此处理程序将发布用户提供的处理程序 a变成 strand与原始 s 相同的队列相关联股。作为 strand 的生命周期对象不影响处理程序队列的生命周期, async_op()不需要关心 s 的生命周期.

io_servicestrand 相关联被销毁,未调用的处理程序被销毁。 documentation状态:

Uninvoked handler objects that were scheduled for deferred invocation on the io_service, or any associated strand, are destroyed.



更详细地说,strand 实现负责对处理程序进行排队并保证其处理程序中只有一个已发布到 io_service。一次,还有一个 strand仅提供一个委托(delegate)给 strand 实现的公共(public) API。每个 strand与一个 strand 实现相关联,一个 strand 实现可能与许多 strand 相关联s。这种关系允许许多不同的 strand 共享单链实现。对象。因此,文档 remarks :

The implementation makes no guarantee that handlers posted or dispatched through different strand objects will be invoked concurrently.



Boost.Asio 控制这些 strand 实现的生命周期,并在固定大小的 strand 实现池中延迟分配它们。池的大小可以通过定义 BOOST_ASIO_STRAND_IMPLEMENTATIONS 来配置到所需的数字。作为 strand 的生命周期对象不影响 strand 实现的生命周期,异步操作不需要关心 strand 的生命周期。处理程序被包裹在其中。

关于boost - 如果调用 asio::strand 的析构函数时,该链上仍有一些就绪/未就绪的处理程序怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23822400/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com