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