在几个线程上运行asio strand和io_service

 手机用户2502914287 发布于 2023-02-12 22:36

我不确定与股线有关的一个细节.

假设以下情况:两个独立的对象,每个对象都有自己的链.并且每个链与一个共同的io_service相关.每个对象使用他的strand进行发布和包装异步操作.如果我在多个线程上有这个(唯一的)io_service .run(),我不确定是否会发生以下情况:

    其中一个对象发布的所有操作和异步包装将不同时执行.因此,与其中一个对象相关的所有操作都将按顺序执行(已发布的操作将按照与发布时相同的顺序执行.包装的异步操作将以未指定的顺序执行,因为它们是异步的,但仍然是串行执行的).

    两次手术起源于不同的对象(因此发布或与同一io_service对象不同链的对象包装),可以执行并行.

    总之,每个对象将连续执行其发布和包装的处理程序,但是从不同对象(链)发布和包装的处理程序将同时执行.

       +-----------------+  +-----------------+
       | Obj1            |  | Obj2            |
       | +-------------+ |  | +-------------+ |             
       | |   Strand_1  | |  | |   Strand_2  | |               
       | +-------------+ |  | +-------------+ |                
       +--------+--------+  +-------+---------+                
                |                   |                          
                +--------+  +-------+                          
                         |  |                                         
                    +----+--+----+                                      
                    | io_service |                                      
                    +------------+                                      
                           |                                          
                           |                                          
                  +--------+-------+                         
                  |                |                                
             Thread1             Thread_2  
             io_service.run()    io_service.run()                              
    

我对吗?

谢谢

1 个回答
  • 简而言之,它strand保证对其自己的处理程序的顺序调用,但不保证从不同的链中并发执行处理程序.因此,这些要点的答案是:

      是.顺序调用是有保证的.

      是.并发执行可能会发生,但无法保证.

      是顺序调用,但不保证并发执行发生.


    A strand维护自己的处理程序队列,并保证只有一个处理程序在其中io_service,导致处理程序在被放入之前被同步io_service.因此,通过a发布或发送的所有处理程序strand将按顺序执行.

    strand可以发生通过不同s 发布或分派的处理程序的并发执行,但不能保证发生.该文件规定:

    该实现不保证将同时调用通过不同strand对象发布或分派的处理程序.

    因此,如果Thread1正在执行通过发布的处理程序Strand_1,Boost.Asio将不会使用该信息来保证发布的处理程序Strand_2将被执行Thread2; 但是,可以根据其他实现细节Thread2选择执行处理程序Strand_2,例如作为运行该程序的线程列表中的下一个可用线程io_service.

    例如,考虑3个处理器的情况下A,BC准备中运行io_service:

    A发布通过Strand_1.

    B没有通过发布strand.

    C发布了Strand_2.

    如果Thread1并且Thread2正在运行io_service,那么一个可能的执行顺序是:

    Thread1         | Thread2
    ----------------+----------------
    start A()       | start B()
    `-- finish A()  | |
    start C()       | `-- finish B()
    `-- finish C()  |
    

    所示的执行顺序表明不保证同时执行通过不同s(和分别)发布的处理程序(AC).strandStrand_1Strand_2

    2023-02-12 22:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有