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

时间:2013-11-13 06:06:21

标签: c++ multithreading boost boost-asio

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

1 个答案:

答案 0 :(得分:5)

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使用async_op_2的完成处理程序启动task2

以下是io_service::strand order of handler invocation文档的相关摘录:

  

假设:

     
      
  • 一个子对象s
  •   
  • 对象a符合完成处理程序要求
  •   
  • 一个对象a1,它是由实现
  • 制作的任意副本   
  • 对象b符合完成处理程序要求
  •   
  • 一个对象b1,它是由实现
  • 生成的b的任意副本   
     

如果满足以下任一条件:

     
      
  • s.post(a)发生在[{1}}
  • 之前   
  • ...
  •   
     

然后s.post(b)发生在之前   asio_handler_invoke(a1, &a1)