4

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

4

1 回答 1

7

strand提供不同时执行完成处理程序的保证并定义处理程序调用的顺序。简而言之,发布到 a 中的完成处理程序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_2task2

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

鉴于:

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

如果以下任一条件为真:

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

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

于 2013-11-13T20:18:03.407 回答