找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4030|回复: 1

关于ACE服务端编写的高效问题的一些讨论

[复制链接]
发表于 2007-12-31 22:37:00 | 显示全部楼层 |阅读模式
  1. int  CClientService::handle_output (ACE_HANDLE){
  2.     ACE_Message_Block *mb;
  3.     ACE_Time_Value nowait (ACE_OS::gettimeofday ());
  4.     if(-1 != this->getq (mb, &nowait)){                        //这里用while还是if好些,对于一个putq相当快的线程
  5.        int recv_cnt = mb->length();
  6.        ssize_t send_cnt = this->peer ().send(mb->rd_ptr (), mb->length ()); //因为send相对来说比较费时
  7.        if(send_cnt == -1 && ACE_OS::last_error() != EWOULDBLOCK){
  8.            return -1;
  9.         }else{
  10.             if(send_cnt == -1){
  11.                send_cnt = 0;
  12.             }
  13.             mb->rd_ptr (static_cast (send_cnt));
  14.         }
  15.         if(mb->length () > 0) {
  16.              this->ungetq (mb);
  17.              return 1;
  18.         }  
  19.        mb->release ();
  20. /*                                                 //是否需要sleep来,对CPU占用缓解有没有更好的方法
  21.   ACE_Time_Value tv(0, 100);
  22.   ACE_OS::sleep(tv);
  23. */
  24.     }
  25.     if (this->msg_queue ()->is_empty())
  26.          this->reactor()->cancel_wakeup(this, ACE_Event_Handler::WRITE_MASK);
  27.     else
  28.          this->reactor ()->schedule_wakeup(this, ACE_Event_Handler::WRITE_MASK);
  29.     return 0;
  30. }
复制代码
 楼主| 发表于 2007-12-31 22:37:08 | 显示全部楼层
有问题,发送失败后,有内存泄漏,没有调用mb->release();

另外,完全不需要:
/*                                                
  ACE_Time_Value tv(0, 100);
  ACE_OS::sleep(tv);
*/
上面直接改成while循环,取数据失败后再退出即可。这是程序员指南上的例子改的吧?
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-22 07:07 , Processed in 0.011263 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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