找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4184|回复: 4

这样使用reactor会不会造成reactor多响应?

[复制链接]
发表于 2010-7-3 11:30:12 | 显示全部楼层 |阅读模式
windows下使用ACE_TP_Reactor构造时候默认构造里面的ACE_Select_Reactor。
只有一个线程run_reactor_event_loop。
用含有ACE_SOCK_Stream的eventhandler注册到reactor。

想在触发一次handle_input时,首先将该句柄挂起,然后开线程接收数据,接收线程完成接收再唤醒句柄。
但是发现suspend_handler挂起不起作用,就换了一种方法,即有一个接收数据的锁,在触发handle_input时,tryacquire失败则返回0,成功则开线程接收,接收线程完成接收就release。(这里使用的不是递归锁可以保证互斥)
现在怀疑reactor被触发的handle_input比实际要接收的次数多,
请问会有这样的情况不?
发表于 2010-7-5 10:16:25 | 显示全部楼层
handle_input之后再开个线程接数据?
累不累呀!直接recv就成了
 楼主| 发表于 2010-7-6 11:36:02 | 显示全部楼层
因为连接比较多 或者有数据长度大于MTU会造成网络等待
发表于 2010-7-13 21:48:17 | 显示全部楼层
你把ACE_TP_Reactor的使用方式搞错了,ACE_TP_Reactor中的TP是指Thread Pool(线程池),ACE已经帮你进行了管理,ACE_TP_Reactor采用的是leader-follower(如果我没记错的话,即领导者、跟随者模式)的,同时只会有一个线程在等待事件,当事件到来时,该线程会被唤醒,然后让下一个线程等待新的事件,而该线程则处理你的事件请求(这是leader-follower的来历),ACE已经帮你做了全部的工作了,你只需要同普通的Reactor一样使用就可以了,根本不需要自己阻塞线程。另外,如果你想高效的话,建议使用Proactor(采用异步IO工作)。
发表于 2010-7-15 00:17:04 | 显示全部楼层
因为连接比较多 或者有数据长度大于MTU会造成网络等待
sokiiya 发表于 2010-7-6 11:36


连接多,对TP reactor会有性能影响,大于MTU不会造成网络等待。
楼上的解释很清楚
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-1 08:19 , Processed in 0.021319 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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