wishel 发表于 2008-8-6 23:24:22

ACE_TP_Reactor的奇怪问题

根据说明文档,ACE_TP_Reactor使用了Leader/Followers pattern,某一时刻只有一个leader thread可以运行某一个handle的handler。即保证在该handle上并发产生的events会被serialized。
但是在5.6版自带的examples\Reactor\TP_Reactor中的例子却认为这里有一个bug(并没有保证上面说的serialization),详见该目录里的readme文件。

wishel 发表于 2008-8-7 09:33:07

没体力看源码,猜测一下原因:
有多个线程同时运行reactor的run_event_loop。
对同一socket,发生一个readmask event后,被一个线程处理(handle_input)。假如在这个线程还没处理完毕返回之前,对方又传过来数据,又会产生一个readmask event,这时这个event就会被另一个空闲的线程处理,那么此时这两个线程就会并发运行。
而所谓的serialization是指,当一个socket上同时发生readmask和writemask时,会被一个线程串行处理。如上所述,如果是先后发生,就不一定保证串行化。
以上仅为猜测,等有时间再做进一步求证。

winston 发表于 2008-8-7 10:23:58

有道理。
我也碰见过这类问题。有些事务,的确需要串行化,保证一个地址来的数据,能被一个线程顺序处理。不然因为线程调度的关系,会产生处理顺序颠倒的问题。我做的操作是用队列进行缓冲和分离,分离到不同的处理队列,这样就能保证了。
页: [1]
查看完整版本: ACE_TP_Reactor的奇怪问题