找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 23574|回复: 43

关于ACE_WIN32_Proactor代码的一些疑惑

[复制链接]
发表于 2009-5-13 22:51:41 | 显示全部楼层 |阅读模式
近日在学习前摄器模式,但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() ?
发表于 2009-5-14 10:19:35 | 显示全部楼层
是这样的,多线程启动有自己负责
发表于 2009-5-15 11:49:16 | 显示全部楼层
你可以用多个线程执行:while(TRUE){ ACE_Proactor::instance()->run_event_loop() }
 楼主| 发表于 2009-5-15 12:42:14 | 显示全部楼层
谢谢各位
发表于 2009-6-3 23:09:02 | 显示全部楼层
这个是内核的线程数目,不是ace proactor框架的线程数,
ace proactor框架要把自己寄生在程序的某个线程下(主线程和非主线程都可以)
发表于 2009-6-15 14:37:19 | 显示全部楼层
为什么要多线程跑proactor?它就是用来替代多线程的。先把原理搞清楚,不要为了用而用。
发表于 2009-6-15 16:53:34 | 显示全部楼层
在windows下,为什么要多线程跑proactor,
可以参考windows网络编程,8.25节完成端口模型,
多个线程运行完成proactor不是由ACE决定的,
而是由windows对完成端口的设计初衷决定的。
发表于 2009-6-16 14:46:00 | 显示全部楼层
原帖由 modern 于 2009-6-15 16:53 发表
多个线程运行完成proactor不是由ACE决定的,
而是由windows对完成端口的设计初衷决定的。 ...

ACE的proactor由windows决定?
楼主问的是“难道我们在使用ACE_Proactor模式时,要启动一组相对应的线程,在每个线程中调用ACE_Proactor::instance()->run_event_loop() ?”
请问你在windows下,是这么用的吗?

异步io的具体实现是由os提供的,windwos在底层是用了多线程方式。unix下有2种,一种是多线程,一种是异步信号。但我们不必关心它底层怎么实现的。明白proactor提供给我们的语义就可以了,它给我们的是异步io的语义,不是多线程。
发表于 2009-6-16 15:39:04 | 显示全部楼层
首先,楼上还是没看我说话的前提哦,我第一句话就说的是“在windows下”,
之后一切的说的问题都是针对windows来说的,我没有提及任何proactor关于unix的问题。
然后,而且楼主的问题也是在问关于“ACE_WIN32_Proactor代码的一些疑惑”,
证明我回答的应该是对题的。
最后,楼上说的没错,proactor本身是为我们提供了异步的语义,没说多线程的事情,我赞同。
不过在windows下,我的的确确说了是在windows下,使用多线程运行proactor事件循环,会带来效率的提升,
这是windows下使用多线程启动proactor的原因,我想我回答了楼主的问题,
另咱俩的观点仍然不矛盾哦。

[ 本帖最后由 modern 于 2009-6-16 15:54 编辑 ]
发表于 2009-6-16 15:51:39 | 显示全部楼层
楼主问的是“难道我们在使用ACE_Proactor模式时,要启动一组相对应的线程,在每个线程中调用ACE_Proactor::instance()->run_event_loop() ?”
请问你在windows下,是这么用的吗?

那我问的也是windows下。前面说unix只是提示作用。
请问,你在windows下,是开一组线程,每个线程都跑proactor的event loop么?

[ 本帖最后由 wishel 于 2009-6-16 15:53 编辑 ]
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-23 17:56 , Processed in 0.020450 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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