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

cap*_*one 3 c++ multithreading boost boost-asio

我有一个boost::io_service顶部的线程池.我在整个应用程序中将它用于不同的CPU绑定任务.对于某些任务,我必须保证任务将按指定的顺序执行(解码视频流).使用io_service::strand保证当前不会执行任务,但不保证执行顺序.换句话说,任务#5可以在任务#4之前执行.有没有什么方法可以解决这个问题,除了在执行当前后调度下一个任务.

Tan*_*ury 6

strand提供了不同时执行完成处理程序的保证,并定义了处理程序调用的顺序.简而言之,发布到a strand中的完成处理程序的执行顺序与发布顺序相同.

因此:

strand_.post(&task1);
strand_.post(&task2);
strand_.post(&task3);
Run Code Online (Sandbox Code Playgroud)

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

async_read(socket1, ..., strand_.wrap(&task1));
async_read(socket2, ..., strand_.wrap(&task2));
async_read(socket3, ..., strand_.wrap(&task3));
Run Code Online (Sandbox Code Playgroud)

如果必须以指定顺序调用完成处理程序以进行异步操作,则:

  • 队列完成处理程序并手动管理订单.
  • 序列化所有异步操作.例如,async_op_1完成处理程序以完成处理程序task1启动.async_op_2task2

下面是相关的摘录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).