boost::io_service 如何保证处理程序执行顺序

boost::io_service How to guarantee handler execution sequence

本文关键字:处理 程序 顺序 何保证 执行 io service boost      更新时间:2023-10-16

我有一个线程池,上面有boost::io_service。我将其用于整个应用程序中不同的 CPU 密集型任务。对于某些任务,我必须保证任务将按指定的顺序执行(解码视频流)。使用io_service::strand保证任务当前不会执行,但它不能保证执行顺序。换句话说,任务 #5 可以在任务 #4 之前执行。除了在当前执行后安排下一个任务之外,是否有任何方法可以解决这个问题。

>strand既保证不同时执行完成处理程序,又定义处理程序调用的顺序。 简而言之,发布到strand中的完成处理程序的执行顺序与发布顺序相同。

因此:

strand_.post(&task1);
strand_.post(&task2);
strand_.post(&task3);

保证处理程序调用的顺序task1 -> task2 -> task3 。 但是,不能保证异步操作的包装完成处理程序,因为未指定执行异步操作的顺序。 例如,以下内容不提供相同的保证:

async_read(socket1, ..., strand_.wrap(&task1));
async_read(socket2, ..., strand_.wrap(&task2));
async_read(socket3, ..., strand_.wrap(&task3));

如果必须按异步操作的指定顺序调用完成处理程序,则

  • 排队完成处理程序并手动管理订单。
  • 序列化所有异步操作。 例如,async_op_1 的完成处理程序task1使用 task2 的完成处理程序启动async_op_2

以下是io_service::strand 的处理程序调用顺序文档的相关摘录:

鉴于:

  • 一个链对象s
  • 满足完成处理程序要求a的对象
  • 一个对象a1,它是实现制作的任意副本
  • 满足完成处理程序要求b的对象
  • 一个对象b1,它是实现制作的 B 的任意副本

如果满足以下任一条件:

  • s.post(a)发生在s.post(b)之前

然后asio_handler_invoke(a1, &a1)发生之前 asio_handler_invoke(b1, &b1) .