freeeyes 发表于 2010-7-26 14:40:11

这里确实需要修改一下ACE的源代码。
给ACE_Asynch_Read_Stream增加两个接口。把原来的
int
ACE_Asynch_Read_Stream:open (ACE_Handler &handler,
                              ACE_HANDLE handle,
                              const void *completion_key,
                              ACE_Proactor *proactor)
{
// Get a proactor for/from the user.
proactor = this->get_proactor (proactor, handler);

// Now let us get the implementation initialized.
if ((this->implementation_ = proactor->create_asynch_read_stream ()) == 0)
    return -1;

// Call the <open> method of the base class.
return ACE_Asynch_Operation:open (handler,
                                     handle,
                                     completion_key,
                                     proactor);
}
拆分成两个新的函数
int
ACE_Asynch_Read_Stream::Create(ACE_Handler &handler,
                              ACE_HANDLE handle,
                              ACE_Proactor *proactor)
{
proactor = this->get_proactor (proactor, handler);

// Now let us get the implementation initialized.
if ((this->implementation_ = proactor->create_asynch_read_stream ()) == 0)
    return -1;

return 0;

}


int
ACE_Asynch_Read_Stream::Bind(ACE_Handler &handler,
                              ACE_HANDLE handle,
                              const void *completion_key,
                              ACE_Proactor *proactor)
{
// Call the <open> method of the base class.
return ACE_Asynch_Operation:open (handler,
                                     handle,
                                     completion_key,
                                     proactor);

}

修改了一下ACE的源码,ACE_Asynch_Read_Stream和ACE_Asynch_Write_Stream对象,修改后,在高并发下CPU使用率明显降低。不过不能要求每个使用者都要重新改写一下ACE的代码吧。。。
既然ACE的Proactor提供了make_handler()方法,就是说明鼓励你使用自己的handler池,但是,这里却留下了一个陷阱。正在下载5.8看看有没有变化,modern在不,有QQ没?呵呵,加我一个吧。

winston 发表于 2010-7-26 15:28:51

我抽空给代码维护者发信说明一下。这个的确是问题。

freeeyes 发表于 2010-7-26 16:32:41

http://blog.vckbase.com/bastet/archive/2005/08/26/11540.html

freeeyes 发表于 2010-7-26 16:32:43

http://blog.vckbase.com/bastet/archive/2005/08/26/11540.html

freeeyes 发表于 2010-7-26 16:33:29

七猫解决了,他的方法是重载了这个对象,我按照这个方法改,已经没有问题了。

dwh0403 发表于 2010-7-30 22:43:45

如winston所讲,还是给ACE user发封信去在代码中去彻底解决这个问题
页: 1 [2]
查看完整版本: 关于Proactor使用Handler池内存泄露的问题