找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3721|回复: 1

TP_Reactor的定时器的问题

[复制链接]
发表于 2009-7-24 17:19:57 | 显示全部楼层 |阅读模式
最近基于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就是这么设计的。
发表于 2009-7-25 15:36:41 | 显示全部楼层
在不过我印象里一直认为是,Reactor框架已经保证了,
同一个ACE_Svc_Handler的定时器不会同时被多个线程调用

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

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

另外强烈建议设计的时候,不要出现这个timeout还没处理完,下一个expire又到了的情况,这时候会出现古怪的问题。包括其他reactor和proactor在内都存在这个问题。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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