front_windy 发表于 2009-7-10 13:53:04

刚开始接触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 编辑 ]

modern 发表于 2009-7-10 14:19:12

想问问楼主,
你从哪看到的read返回值不等于0是成功的呢?
注意这里是异步读,会立刻返回的。
0成功,-1失败。

front_windy 发表于 2009-7-10 15:07:51

嗯 知道了,谢谢modern。
另外还有一个问题,希望版主解答。我用ACE_Asynch_Acceptor建立了一个简单的监听器。运行后cpu使用率90%,如果客户端不去连他,他空跑一会后就出现
ACE_Asynch_Acceptor::accept: no buffer space available,是什么原因。任务比较急,希望能帮我解答。

front_windy 发表于 2009-7-10 15:12:05

大概找到问题了,可能是未完成的异步操作太多了。

modern 发表于 2009-7-10 15:24:07

感觉可能是ACE_Asynch_Acceptor::open函数的参数设置有问题:
返回这个错误的一般是系统调用linsten或者accept的时候由于不够用
而返回WSAENOBUFS。
先考虑调整一下open的参数,然后跟一下堆栈,看是哪个函数返回了这个错误。
然后应该可以具体定位错误。

front_windy 发表于 2009-7-10 15:36:27

在open的时候,用的ACE默认的参数,ACE_DEFAULT_BACKLOG。我把他改成10了,cpu使用率也下来了,也不报错了。。。

wishel 发表于 2009-7-10 15:44:39

楼主可参考下这个帖子
http://www.acejoy.com/bbs/viewthread.php?tid=854&extra=page%3D4

winston 发表于 2009-7-10 15:46:34

ACE_DEFAULT_BACKLOG - 这个数值有问题。以往有人报告过。这是个BUG,你可以打印出来是多少。并非是默认的那个值,而是一个奇大无比的数字,直接导致资源耗尽。

所以不要用这个定义的值。

modern 发表于 2009-7-10 15:46:41

我的记得winston提过这个问题,
BACKLOG要改的大一点,
但是linsten的时候,
这个值如果大于5会被截断成5。
我也没太想明白为什么。

看样子应该问题是应该出在对
AcceptEx的调用上了,
如果你有时间可以在WIN32_Asynch_IO.cpp的
2039行处调用打一个断点。
int initiate_result = ::AcceptEx ((SOCKET) result->listen_handle (),
看是不是这里出的错误。

front_windy 发表于 2009-7-10 15:47:37

嗯 看到了。谢谢各位版主
页: [1]
查看完整版本: 刚开始接触ACE,一个关于Proactor的问题