boost :: io_service如何保证处理程序执行顺序

卡彭

我的线程池boost::io_service位于顶部。我将它用于整个应用程序中不同的CPU绑定任务。对于某些任务,我必须保证任务将以指定的顺序执行(解码视频流)。使用io_service::strand保证当前不会执行任务,但是不能保证执行顺序。换句话说,任务#5可以在任务#4之前执行。除了在执行当前任务后安排下一个任务之外,是否有任何方法可以解决该问题。

坦纳·桑斯伯里(Tanner Sansbury)

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_2task2

下面是相关的摘录io_service::strand处理程序调用的顺序文件:

鉴于:

  • 股线对象 s
  • a满足完成处理程序要求的对象
  • 一个对象a1该对象是实现实现的任意副本
  • b满足完成处理程序要求的对象
  • 一个对象b1该对象是实现实现的b的任意副本

如果满足以下任一条件:

  • s.post(a) 发生之前 s.post(b)
  • ...

然后asio_handler_invoke(a1, &a1)发生-before asio_handler_invoke(b1, &b1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

不保持 io_service 运行的 Boost asio 处理程序

来自分类Dev

boost asio io_service是否保证两个并行调用链的执行?

来自分类Dev

Qt 事件处理程序和 boost ASIO 的 io_service 有什么区别?

来自分类Dev

boost io_service非阻塞并行执行?

来自分类Dev

如何使用 boost::asio::io_service::run_one()

来自分类Dev

循环调用boost io_service poll

来自分类Dev

嵌套的boost :: bind与io_service :: post

来自分类Dev

Boost 1.70 io_service弃用

来自分类Dev

在Boost线程中运行boost asio io_service

来自分类Dev

使用Boost线程和io_service创建线程池

来自分类Dev

Boost Asio,多个线程和多个io_service

来自分类Dev

从std :: thread调用boost :: asio :: io_service :: run

来自分类Dev

一定时间后停止boost :: io_service

来自分类Dev

boost :: io_service :: post队列请求吗?

来自分类Dev

在stop()之后清除boost :: asio :: io_service

来自分类Dev

一定时间后停止boost :: io_service

来自分类Dev

从std :: thread调用boost :: asio :: io_service :: run

来自分类Dev

使用boost :: asio :: io_service作为类成员字段

来自分类Dev

如何防止Boost :: Asio计时器阻止io_service :: run()的返回?

来自分类Dev

在boost :: asio :: io_service :: work被销毁后,asio :: io_service :: run不返回

来自分类Dev

使用boost io_service初始化boost udp套接字时出错

来自分类Dev

从boost :: asio :: io_service :: work作为分离线程运行时捕获异常

来自分类Dev

Boost Asio:在不使io_service继续运行的情况下捕获信号

来自分类Dev

为什么boost :: asio :: io_service无法用std :: bind编译?

来自分类Dev

Boost Asio io_service析构函数在OS X上挂起

来自分类Dev

在boost :: asio :: io_service上运行时调用时崩溃

来自分类Dev

boost asio发布不起作用,io_service :: run在发布后立即退出

来自分类Dev

没有工作时boost :: asio :: io_service :: run不返回

来自分类Dev

链接libboost_log.so使boost :: asio :: io_service :: run立即退出

Related 相关文章

  1. 1

    不保持 io_service 运行的 Boost asio 处理程序

  2. 2

    boost asio io_service是否保证两个并行调用链的执行?

  3. 3

    Qt 事件处理程序和 boost ASIO 的 io_service 有什么区别?

  4. 4

    boost io_service非阻塞并行执行?

  5. 5

    如何使用 boost::asio::io_service::run_one()

  6. 6

    循环调用boost io_service poll

  7. 7

    嵌套的boost :: bind与io_service :: post

  8. 8

    Boost 1.70 io_service弃用

  9. 9

    在Boost线程中运行boost asio io_service

  10. 10

    使用Boost线程和io_service创建线程池

  11. 11

    Boost Asio,多个线程和多个io_service

  12. 12

    从std :: thread调用boost :: asio :: io_service :: run

  13. 13

    一定时间后停止boost :: io_service

  14. 14

    boost :: io_service :: post队列请求吗?

  15. 15

    在stop()之后清除boost :: asio :: io_service

  16. 16

    一定时间后停止boost :: io_service

  17. 17

    从std :: thread调用boost :: asio :: io_service :: run

  18. 18

    使用boost :: asio :: io_service作为类成员字段

  19. 19

    如何防止Boost :: Asio计时器阻止io_service :: run()的返回?

  20. 20

    在boost :: asio :: io_service :: work被销毁后,asio :: io_service :: run不返回

  21. 21

    使用boost io_service初始化boost udp套接字时出错

  22. 22

    从boost :: asio :: io_service :: work作为分离线程运行时捕获异常

  23. 23

    Boost Asio:在不使io_service继续运行的情况下捕获信号

  24. 24

    为什么boost :: asio :: io_service无法用std :: bind编译?

  25. 25

    Boost Asio io_service析构函数在OS X上挂起

  26. 26

    在boost :: asio :: io_service上运行时调用时崩溃

  27. 27

    boost asio发布不起作用,io_service :: run在发布后立即退出

  28. 28

    没有工作时boost :: asio :: io_service :: run不返回

  29. 29

    链接libboost_log.so使boost :: asio :: io_service :: run立即退出

热门标签

归档