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就是这么设计的。 在不过我印象里一直认为是,Reactor框架已经保证了,
同一个ACE_Svc_Handler的定时器不会同时被多个线程调用
遇到问题,我的建议是先看书。如果还有不明白的地方再来论坛发帖询问。
书是最权威的,别人的任何解释都不能代替你对书上内容的理解。
tp_reactor内部的协议只保证不会有同一handle上的input和output handler不会被并发调用。
对于timer handler需要自己做同步,书上说的比较清楚的。
另外强烈建议设计的时候,不要出现这个timeout还没处理完,下一个expire又到了的情况,这时候会出现古怪的问题。包括其他reactor和proactor在内都存在这个问题。
页:
[1]