关于ACE_WIN32_Proactor代码的一些疑惑
近日在学习前摄器模式,但ACE_WIN32_Proactor中的一些代码实在是不解,望高手解答,不胜感激!ACE_WIN32_Proactor是对windows下IOCP的封装,IOCP是允许多个线程对其绑定的,也就是在对应的每个线程调用GetQueuedCompletionStatus。ACE_WIN32_Proactor中调用GetQueuedCompletionStatus的只有ACE_WIN32_Proactor::handle_events()这个函数。而我在使用ACE_Proactor模式的时候通常在某个线程中写如下语句:while(TRUE){ ACE_Proactor::instance()->run_event_loop() }该语句在windows下实际调用ACE_WIN32_Proactor::handle_events()
也就是说只有一个线程在等待完成端口(因为只有一处调用GetQueuedCompletionStatus)。我就想ACE应该不会如此吧。在ACE_WIN32_Proactor的构造函数
ACE_WIN32_Proactor::ACE_WIN32_Proactor (size_t number_of_threads,
int used_with_reactor_event_loop)
: completion_port_ (0),
// This *MUST* be 0, *NOT* ACE_INVALID_HANDLE !!!
number_of_threads_ (static_cast<DWORD> (number_of_threads)),
used_with_reactor_event_loop_ (used_with_reactor_event_loop)
{
// Create the completion port.
this->completion_port_ = ::CreateIoCompletionPort (INVALID_HANDLE_VALUE,
0,
0,
this->number_of_threads_);
if (this->completion_port_ == 0)
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("CreateIoCompletionPort")));
this->get_asynch_pseudo_task ().start ();
}
number_of_threads 参数指定的是与IOCP的绑定线程数。但我在代码中没有发现启动该绑定线程池的地方。this->get_asynch_pseudo_task ().start ();中是有启动多个线程的语句,但是与number_of_threads 无关,它只是启动一个与Reactor相关的线程。即便是在构造函数中给number_of_threads 赋值也没用。难道我们在使用ACE_Proactor模式时,要启动一组相对应的线程,在每个线程中调用ACE_Proactor::instance()->run_event_loop() ? 是这样的,多线程启动有自己负责 你可以用多个线程执行:while(TRUE){ ACE_Proactor::instance()->run_event_loop() } 谢谢各位 这个是内核的线程数目,不是ace proactor框架的线程数,
ace proactor框架要把自己寄生在程序的某个线程下(主线程和非主线程都可以) 为什么要多线程跑proactor?它就是用来替代多线程的。先把原理搞清楚,不要为了用而用。 在windows下,为什么要多线程跑proactor,
可以参考windows网络编程,8.25节完成端口模型,
多个线程运行完成proactor不是由ACE决定的,
而是由windows对完成端口的设计初衷决定的。 原帖由 modern 于 2009-6-15 16:53 发表 http://www.acejoy.com/bbs/images/common/back.gif
多个线程运行完成proactor不是由ACE决定的,
而是由windows对完成端口的设计初衷决定的。 ...
ACE的proactor由windows决定?
楼主问的是“难道我们在使用ACE_Proactor模式时,要启动一组相对应的线程,在每个线程中调用ACE_Proactor::instance()->run_event_loop() ?”
请问你在windows下,是这么用的吗?
异步io的具体实现是由os提供的,windwos在底层是用了多线程方式。unix下有2种,一种是多线程,一种是异步信号。但我们不必关心它底层怎么实现的。明白proactor提供给我们的语义就可以了,它给我们的是异步io的语义,不是多线程。 首先,楼上还是没看我说话的前提哦,我第一句话就说的是“在windows下”,
之后一切的说的问题都是针对windows来说的,我没有提及任何proactor关于unix的问题。
然后,而且楼主的问题也是在问关于“ACE_WIN32_Proactor代码的一些疑惑”,
证明我回答的应该是对题的。
最后,楼上说的没错,proactor本身是为我们提供了异步的语义,没说多线程的事情,我赞同。
不过在windows下,我的的确确说了是在windows下,使用多线程运行proactor事件循环,会带来效率的提升,
这是windows下使用多线程启动proactor的原因,我想我回答了楼主的问题,
另咱俩的观点仍然不矛盾哦。
[ 本帖最后由 modern 于 2009-6-16 15:54 编辑 ] 楼主问的是“难道我们在使用ACE_Proactor模式时,要启动一组相对应的线程,在每个线程中调用ACE_Proactor::instance()->run_event_loop() ?”
请问你在windows下,是这么用的吗?
那我问的也是windows下。前面说unix只是提示作用。
请问,你在windows下,是开一组线程,每个线程都跑proactor的event loop么?
[ 本帖最后由 wishel 于 2009-6-16 15:53 编辑 ]