gpt4 book ai didi

c++ - boost asio 服务队列深度和策略

转载 作者:太空狗 更新时间:2023-10-29 20:45:02 24 4
gpt4 key购买 nike

我知道一个正在运行的 asio 服务就像一个队列,我可以用它来发布线程将按顺序执行的任务。但是,与任何队列一样,我想也有限制。是否可以为 asio 服务设置此限制?是否可以设置队列满时遵循什么策略(即阻塞、非阻塞等)?

更新

假设我有一个运行 asio::service 的线程和一个计时器,每 10 毫秒向该线程发送一个任务。任务接收绑定(bind)到一个方法调用,这将使线程休眠 100 毫秒。因此,我有一个计时器每秒向一个线程发布 100 个任务,该线程每秒能够执行 10 个任务。很明显,这种情况会有所不同。然而,在处理队列时,通常有办法确定队列深度(100?1000?队列中的帖子等)或指定发送方在队列已满时应遵循的策略(即等待还是丢弃)请求并继续?)。我的问题是何在 asio::service 中设置这些功能?

最佳答案

Asio 不提供控制内部数据结构的策略。但是,它确实提供了处理程序分配的 Hook :asio_handler_allocateasio_handler_deallocate .应用程序可以使用这些 Hook 来限制未完成的异步操作的数量,以及定义达到用户指定限制时的行为。

有几个关键点需要考虑:

  • asio_handler_allocate 预期返回一个有效的内存块或抛出异常。如果从 asio_handler_allocate 中抛出异常,它将继续通过类似 io_service::post() 的调用展开堆栈。 .因此,对于达到最大值时的非阻塞行为,抛出可能是唯一的选择。
  • 考虑对组合操作的影响,例如 async_read ,其中 asio_handler_allocateasio_handler_deallocate 可能被调用多次。如果抛出异常,线程的堆栈将至少展开到 io_service::run 被调用的位置。如果发生阻塞,则有可能让所有为 react 器服务的线程都被阻塞,从而基本上阻止所有异步作业完成。

这里是分配example来自 Boost.Asio 示例,显示了用于处理程序的内存池。

关于c++ - boost asio 服务队列深度和策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11749376/

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