jiuyueshouyi 发表于 2011-1-25 15:03:59

如何理解ACE_Reactor::instance()

之前看了反应器模式,也试着实现了几个模型,但总觉得有点模糊,今天看了一下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()表达的具体含义是什么?

ztenv 发表于 2011-1-25 18:14:52

不是两个,就是一个Reactor实例,只是注册的事件分发器是两个

jiuyueshouyi 发表于 2011-1-26 12:29:20

事件分发器可以多个,这个我知道的。
线程1:ACE_Reactor reactor1;
线程2:ACE_Reactor reactor2;

这两个实例地址不一样,我指的是同一个进程里面,这样定义实例跟你说的一个reactor实例是什么区别?

modern 发表于 2011-1-26 13:34:06

建议楼主先了解一下单件(singleton)模式。
楼主的目标是可以达成的,
不过切记这时一定不要使用ACE_Reactor::instance.

yaoxing25 发表于 2011-2-18 16:41:51

太久没接触Rector了!
我之前使用过Rector,不是说一个进程中多个Recotr就一定好,ACE_Reactor::instance()可以跨线程使用,楼主可以参考一下楼上的建议,我当时使用的就是(singleton)模式。解决的问题是大数据量吞吐问题。

huzia 发表于 2011-2-21 09:30:10

才开始学习,不太懂的

过路蚂蚁 发表于 2011-2-22 17:58:09

回复 4# modern


    感觉说的很到位,但是具体怎么做呢

earthdog 发表于 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);
页: [1]
查看完整版本: 如何理解ACE_Reactor::instance()