找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 13451|回复: 7

如何理解ACE_Reactor::instance()

  [复制链接]
发表于 2011-1-25 15:03:59 | 显示全部楼层 |阅读模式
之前看了反应器模式,也试着实现了几个模型,但总觉得有点模糊,今天看了一下C++NP v2,受了点启发。
我现在的做法是:主函数创建两个线程,在两个线程中分别实例化ACE_Reactor对象,reactor1和reactor2,这样整个进程中就有了两个反应器(不知道这样的理解方式对不对),然后从ACE_Event_Handler派生了两个事件处理类,分别是Handler1和Handler2,我的原意是在Handler1里面使用reactor1,在Handler2里面使用reactor2,而且确实做到了。我跟踪看了一下,但是在Handler1和Handler2的open函数中,我注册的代码是
ACE_Reactor* r = ACE_Reactor::instance();
int ret = ACE_Reactor::instance()->register_handler(this, ACE_Event_Handler::ACCEPT_MASK);
虽然Handler1和Handler2使用的是不同的reactor,但是这里的r却是相同的,是同一个对象。
我就不明白了,Reactor到底该怎么理解?ACE_Reactor::instance()表达的具体含义是什么?
发表于 2011-1-25 18:14:52 | 显示全部楼层
不是两个,就是一个Reactor实例,只是注册的事件分发器是两个
 楼主| 发表于 2011-1-26 12:29:20 | 显示全部楼层
事件分发器可以多个,这个我知道的。
线程1:ACE_Reactor reactor1;
线程2:ACE_Reactor reactor2;

这两个实例地址不一样,我指的是同一个进程里面,这样定义实例跟你说的一个reactor实例是什么区别?
发表于 2011-1-26 13:34:06 | 显示全部楼层
建议楼主先了解一下单件(singleton)模式。
楼主的目标是可以达成的,
不过切记这时一定不要使用ACE_Reactor::instance.
发表于 2011-2-18 16:41:51 | 显示全部楼层
太久没接触Rector了!
我之前使用过Rector,不是说一个进程中多个Recotr就一定好,ACE_Reactor::instance()可以跨线程使用,楼主可以参考一下楼上的建议,我当时使用的就是(singleton)模式。解决的问题是大数据量吞吐问题。
发表于 2011-2-21 09:30:10 | 显示全部楼层
才开始学习,不太懂的
发表于 2011-2-22 17:58:09 | 显示全部楼层
回复 4# modern


    感觉说的很到位,但是具体怎么做呢
发表于 2011-2-25 10:55:11 | 显示全部楼层
本帖最后由 earthdog 于 2011-2-25 13:13 编辑

ACE_Reactor::instance()采用的是单件模式,在进程中是唯一的,你可以让ACE自动创建一个,也可以使用ACE_Reactor::instance(some_reactor)指定你自己的实例。
如果你要在一个进程里使用超过一个reactor,那么,你就不能使用ACE_Reactor::instance()了,直接使用你自己创建的reactor就行了:

int ret = reactor1->register_handler(this, ACE_Event_Handler::ACCEPT_MASK);

int ret = reactor2->register_handler(this, ACE_Event_Handler::ACCEPT_MASK);
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-22 01:57 , Processed in 0.015428 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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