找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4232|回复: 9

刚开始接触ACE,一个关于Proactor的问题

[复制链接]
发表于 2009-7-10 13:53:04 | 显示全部楼层 |阅读模式
在看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 编辑 ]
发表于 2009-7-10 14:19:12 | 显示全部楼层
想问问楼主,
你从哪看到的read返回值不等于0是成功的呢?
注意这里是异步读,会立刻返回的。
0成功,-1失败。
 楼主| 发表于 2009-7-10 15:07:51 | 显示全部楼层
嗯 知道了,谢谢modern。
另外还有一个问题,希望版主解答。我用ACE_Asynch_Acceptor建立了一个简单的监听器。运行后cpu使用率90%,如果客户端不去连他,他空跑一会后就出现
ACE_Asynch_Acceptor::accept: no buffer space available,是什么原因。任务比较急,希望能帮我解答。
 楼主| 发表于 2009-7-10 15:12:05 | 显示全部楼层
大概找到问题了,可能是未完成的异步操作太多了。
发表于 2009-7-10 15:24:07 | 显示全部楼层
感觉可能是ACE_Asynch_Acceptor::open函数的参数设置有问题:
返回这个错误的一般是系统调用linsten或者accept的时候由于不够用
而返回WSAENOBUFS。
先考虑调整一下open的参数,然后跟一下堆栈,看是哪个函数返回了这个错误。
然后应该可以具体定位错误。
 楼主| 发表于 2009-7-10 15:36:27 | 显示全部楼层
在open的时候,用的ACE默认的参数,ACE_DEFAULT_BACKLOG。我把他改成10了,cpu使用率也下来了,也不报错了。。。
发表于 2009-7-10 15:44:39 | 显示全部楼层
发表于 2009-7-10 15:46:34 | 显示全部楼层
ACE_DEFAULT_BACKLOG - 这个数值有问题。以往有人报告过。这是个BUG,你可以打印出来是多少。并非是默认的那个值,而是一个奇大无比的数字,直接导致资源耗尽。

所以不要用这个定义的值。
发表于 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 (),
看是不是这里出的错误。
 楼主| 发表于 2009-7-10 15:47:37 | 显示全部楼层
嗯 看到了。谢谢各位版主
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-23 18:07 , Processed in 0.017459 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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