刚开始接触ACE,一个关于Proactor的问题
在看ACE的关于Proactor的例子时候,有个地方没搞明白。就是在异步连接建立类(ACE_Aysnch_Acceptor)回调open的里边,发起了一个读操作,成功后却delete this?read不等于不是成功读取吗?为什么还要delete this?代码如下(就是这行"if (this->reader_.read (*mb, mb->space ()) != 0)".void HA_Proactive_Service::open (ACE_HANDLE h, ACE_Message_Block&)
{
this->handle (h);
if (this->reader_.open (*this) != 0 ||
this->writer_.open (*this) != 0 )
{
ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"),
ACE_TEXT ("HA_Proactive_Service open")));
delete this;
return;
}
ACE_Message_Block *mb;
ACE_NEW_NORETURN (mb, ACE_Message_Block (1024));
if (this->reader_.read (*mb, mb->space ()) != 0)
{
ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"),
ACE_TEXT ("HA_Proactive_Service begin read")));
mb->release ();
delete this;
return;
}
// mb is now controlled by Proactor framework.
return;
[ 本帖最后由 front_windy 于 2009-7-10 13:54 编辑 ] 想问问楼主,
你从哪看到的read返回值不等于0是成功的呢?
注意这里是异步读,会立刻返回的。
0成功,-1失败。 嗯 知道了,谢谢modern。
另外还有一个问题,希望版主解答。我用ACE_Asynch_Acceptor建立了一个简单的监听器。运行后cpu使用率90%,如果客户端不去连他,他空跑一会后就出现
ACE_Asynch_Acceptor::accept: no buffer space available,是什么原因。任务比较急,希望能帮我解答。 大概找到问题了,可能是未完成的异步操作太多了。 感觉可能是ACE_Asynch_Acceptor::open函数的参数设置有问题:
返回这个错误的一般是系统调用linsten或者accept的时候由于不够用
而返回WSAENOBUFS。
先考虑调整一下open的参数,然后跟一下堆栈,看是哪个函数返回了这个错误。
然后应该可以具体定位错误。 在open的时候,用的ACE默认的参数,ACE_DEFAULT_BACKLOG。我把他改成10了,cpu使用率也下来了,也不报错了。。。 楼主可参考下这个帖子
http://www.acejoy.com/bbs/viewthread.php?tid=854&extra=page%3D4 ACE_DEFAULT_BACKLOG - 这个数值有问题。以往有人报告过。这是个BUG,你可以打印出来是多少。并非是默认的那个值,而是一个奇大无比的数字,直接导致资源耗尽。
所以不要用这个定义的值。 我的记得winston提过这个问题,
BACKLOG要改的大一点,
但是linsten的时候,
这个值如果大于5会被截断成5。
我也没太想明白为什么。
看样子应该问题是应该出在对
AcceptEx的调用上了,
如果你有时间可以在WIN32_Asynch_IO.cpp的
2039行处调用打一个断点。
int initiate_result = ::AcceptEx ((SOCKET) result->listen_handle (),
看是不是这里出的错误。 嗯 看到了。谢谢各位版主
页:
[1]