我不确定与股线有关的一个细节.
假设以下情况:两个独立的对象,每个对象都有自己的链.并且每个链与一个共同的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()
我对吗?
谢谢
简而言之,它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
,B
和C
准备中运行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(和分别)发布的处理程序(A
和C
).strand
Strand_1
Strand_2