sunway 发表于 2009-7-24 17:19:57

TP_Reactor的定时器的问题

最近基于TP_Reactor搞了个server,用线程池运行TP_Reactor,
然后每个连接建立的时候设置定时器,连接的处理基类是ACE_Svc_Handler,
因此直接用Reactor的schedule_timer设置一个重复的定时器。
            发现定时器到期handle_timeout即被线程A调用,如果线程A在定时器周期内未执行完毕,
则下一个线程B不会等待线程A的定时器执行完毕,就开始下一次handle_timeout,
这样就存在一个ACE_Svc_Handler的handle_timeout会同时被多个线程调用的情况。
因此这就需要接口的使用者,考虑各种比较复杂的线程同步问题,这是我所不愿意看到的。
            当然这个问题也比较好解决,设置一个不重复调用的定时器,
然后保存定时器ID在handle_timeout执行完毕之后,调用reset_timer_interval即可。
         在不过我印象里一直认为是,Reactor框架已经保证了,
同一个ACE_Svc_Handler的定时器不会同时被多个线程调用,
请有用过TP_Reactor经验的朋友帮忙确认一下,是我设置的问题,
还是原本ACE就是这么设计的。

wishel 发表于 2009-7-25 15:36:41

在不过我印象里一直认为是,Reactor框架已经保证了,
同一个ACE_Svc_Handler的定时器不会同时被多个线程调用

遇到问题,我的建议是先看书。如果还有不明白的地方再来论坛发帖询问。
书是最权威的,别人的任何解释都不能代替你对书上内容的理解。

tp_reactor内部的协议只保证不会有同一handle上的input和output handler不会被并发调用。
对于timer handler需要自己做同步,书上说的比较清楚的。

另外强烈建议设计的时候,不要出现这个timeout还没处理完,下一个expire又到了的情况,这时候会出现古怪的问题。包括其他reactor和proactor在内都存在这个问题。
页: [1]
查看完整版本: TP_Reactor的定时器的问题