我在顶部有一个boost::io_service
的线程池。我在整个应用程序中将它用于不同的CPU绑定任务。对于某些任务,我必须保证任务将按指定的顺序执行(解码视频流)。使用io_service::strand
保证当前不会执行任务,但不保证执行顺序。换句话说,任务#5可以在任务#4之前执行。有没有什么方法可以解决这个问题,除了在执行当前后调度下一个任务。
答案 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
符合完成处理程序要求- 一个对象
生成的b的任意副本b1
,它是由实现如果满足以下任一条件:
- 之前
s.post(a)
发生在[{1}}- ...
然后
s.post(b)
发生在之前asio_handler_invoke(a1, &a1)
。