cap*_*one 3 c++ multithreading boost boost-asio
我有一个boost::io_service顶部的线程池.我在整个应用程序中将它用于不同的CPU绑定任务.对于某些任务,我必须保证任务将按指定的顺序执行(解码视频流).使用io_service::strand保证当前不会执行任务,但不保证执行顺序.换句话说,任务#5可以在任务#4之前执行.有没有什么方法可以解决这个问题,除了在执行当前后调度下一个任务.
strand提供了不同时执行完成处理程序的保证,并定义了处理程序调用的顺序.简而言之,发布到a strand中的完成处理程序的执行顺序与发布顺序相同.
因此:
strand_.post(&task1);
strand_.post(&task2);
strand_.post(&task3);
Run Code Online (Sandbox Code Playgroud)
保证处理程序调用的顺序是task1- > task2- > task3.但是,不保证用于异步操作的包装完成处理程序,因为未指定执行异步操作的顺序.例如,以下内容不提供相同的保证:
async_read(socket1, ..., strand_.wrap(&task1));
async_read(socket2, ..., strand_.wrap(&task2));
async_read(socket3, ..., strand_.wrap(&task3));
Run Code Online (Sandbox Code Playgroud)
如果必须以指定顺序调用完成处理程序以进行异步操作,则:
async_op_1完成处理程序以完成处理程序task1启动.async_op_2task2下面是相关的摘录io_service::strand的处理程序调用的顺序文件:
鉴于:
- 一个链对象
sa满足完成处理程序要求的对象- 一个对象
a1,它是由实现产生的任意副本b满足完成处理程序要求的对象- 一个对象
b1,它是由实现产生的b的任意副本如果满足以下任一条件:
s.post(a)之前发生s.post(b)- ...
然后
asio_handler_invoke(a1, &a1)发生在之前asio_handler_invoke(b1, &b1).
| 归档时间: |
|
| 查看次数: |
1282 次 |
| 最近记录: |