找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3809|回复: 2

ACE_TP_Reactor的奇怪问题

[复制链接]
发表于 2008-8-6 23:24:22 | 显示全部楼层 |阅读模式
根据说明文档,ACE_TP_Reactor使用了Leader/Followers pattern,某一时刻只有一个leader thread可以运行某一个handle的handler。即保证在该handle上并发产生的events会被serialized。
但是在5.6版自带的examples\Reactor\TP_Reactor中的例子却认为这里有一个bug(并没有保证上面说的serialization),详见该目录里的readme文件。
 楼主| 发表于 2008-8-7 09:33:07 | 显示全部楼层
没体力看源码,猜测一下原因:
有多个线程同时运行reactor的run_event_loop。
对同一socket,发生一个readmask event后,被一个线程处理(handle_input)。假如在这个线程还没处理完毕返回之前,对方又传过来数据,又会产生一个readmask event,这时这个event就会被另一个空闲的线程处理,那么此时这两个线程就会并发运行。
而所谓的serialization是指,当一个socket上同时发生readmask和writemask时,会被一个线程串行处理。如上所述,如果是先后发生,就不一定保证串行化。
以上仅为猜测,等有时间再做进一步求证。
发表于 2008-8-7 10:23:58 | 显示全部楼层
有道理。
我也碰见过这类问题。有些事务,的确需要串行化,保证一个地址来的数据,能被一个线程顺序处理。不然因为线程调度的关系,会产生处理顺序颠倒的问题。我做的操作是用队列进行缓冲和分离,分离到不同的处理队列,这样就能保证了。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 00:28 , Processed in 0.011215 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表