huang_jin_min 发表于 2010-1-12 23:57:18

关于ACE_Select_Reactor

书上说使用ACE_Select_Reactor只能一个线程执行Reactor_Event_Loop。
这到底要怎么理解?

freeeyes 发表于 2010-1-13 14:51:06

一个CAceReactor有一个run_reactor_event_loop(),如果你用的是单件的CAceReactor对象,则就有一个。

huang_jin_min 发表于 2010-1-13 22:13:21

我觉得还是多个线程可以执行run_reactor_event_loop()的,但是书上很多地方都强调只能一个线程执行run_reactor_event_loop()
指的是创建Select_Reactor的线程和执行run_reactor_event_loop()的线程必须是同一个。
举例来说
例1:
线程1:
ACE_Select_Reactor *select_reactor = new ACE_Select_Reactor;
ACE_Reactor *reactor= new ACE_Reactor(select_reactor,1);
reactor->run_reactor_event_loop();
这种是可以的。

例2:
线程1:
ACE_Select_Reactor *select_reactor1 = new ACE_Select_Reactor;
ACE_Reactor *reactor1= new ACE_Reactor(select_reactor1,1);
reactor1->run_reactor_event_loop();
线程2:
ACE_Select_Reactor *select_reactor2 = new ACE_Select_Reactor;
ACE_Reactor *reactor2= new ACE_Reactor(select_reactor2,1);
reactor2->run_reactor_event_loop();

这样也是可以的
例3:
线程1:
ACE_Select_Reactor *select_reactor = new ACE_Select_Reactor;
ACE_Reactor *reactor1= new ACE_Reactor(select_reactor,1);
线程2:
reactor->run_reactor_event_loop();

这样是不行的
线程2必须这样才行
reactor->owner(ACE_OS::thr_self ());
reactor->run_reactor_event_loop();

以上是我的理解,理解错的地方,还请论坛里的高手指教一下。

freeeyes 发表于 2010-1-14 14:44:59

run_reactor_event_loop()必须在一个线程里面。这是对的。
页: [1]
查看完整版本: 关于ACE_Select_Reactor