boost::io_service 如何保证处理程序执行顺序
boost::io_service How to guarantee handler execution sequence
我有一个线程池,上面有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
使用task2
的完成处理程序启动async_op_2
。
以下是io_service::strand
的处理程序调用顺序文档的相关摘录:
鉴于:
- 一个链对象
s
- 满足完成处理程序要求
a
的对象- 一个对象
a1
,它是实现制作的任意副本- 满足完成处理程序要求
b
的对象- 一个对象
b1
,它是实现制作的 B 的任意副本如果满足以下任一条件:
s.post(a)
发生在s.post(b)
之前- 。
然后
asio_handler_invoke(a1, &a1)
发生之前asio_handler_invoke(b1, &b1)
.
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 为什么我的 IExtractIcon 处理程序没有被调用?
- 在遍历处理程序的向量时注册和注销处理程序
- 有可能在信号处理程序中设置promise吗
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 通过安装信号处理程序关闭多线程应用程序
- QDateTime::toString() 在退出处理程序中使用时失败
- 如何在 WindowProc 处理程序中区分箭头键和数字键盘?
- async_write完成处理程序最早何时完成?
- C++事件系统 - 多态事件和事件处理程序
- 具有shared_ptr的处理程序中的分段错误
- 为什么我的信号处理程序只执行一次?
- GTK C++:找不到信号处理程序 您是否使用 -rdynamic 进行了编译?
- 如何使用从处理程序调度的最终回调将响应异步返回给调用方on_read?
- C++ 在信号处理程序后继续执行
- wxWidgets 拖放文件事件处理程序初始化问题(无效static_cast)
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 没有信号处理程序的POSIX定时器的目的是什么?
- 处理程序的模块列表中有一个错误的模块"WebSocketModule"