提升asio服务队列深度和策略

时间:2012-07-31 21:36:38

标签: c++ boost boost-asio

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

更新

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

2 个答案:

答案 0 :(得分:3)

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

需要考虑以下几个要点:

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

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

答案 1 :(得分:2)

没有我所知道的。至于你的例子,你最好在io_service的线程中有一个执行长时间运行任务的计时器,并在完成工作后重新安排自己。否则你永远不会清理你的队列。如果你想要一个具有良好时序约束的实时系统 - 通用OS /编程和boost.asio都不适用于任务。