我的线程池boost::io_service
位于顶部。我将它用于整个应用程序中不同的CPU绑定任务。对于某些任务,我必须保证任务将以指定的顺序执行(解码视频流)。使用io_service::strand
保证当前不会执行任务,但是不能保证执行顺序。换句话说,任务#5可以在任务#4之前执行。除了在执行当前任务后安排下一个任务之外,是否有任何方法可以解决该问题。
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
的处理程序调用的顺序文件:
鉴于:
- 股线对象
s
a
满足完成处理程序要求的对象- 一个对象
a1
,该对象是实现实现的任意副本b
满足完成处理程序要求的对象- 一个对象
b1
,该对象是实现实现的b的任意副本如果满足以下任一条件:
s.post(a)
发生之前s.post(b)
- ...
然后
asio_handler_invoke(a1, &a1)
发生-beforeasio_handler_invoke(b1, &b1)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句