近日在学习前摄器模式,但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() ? |