peakzhang 发表于 2007-12-31 22:37:00

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

intCClientService::handle_output (ACE_HANDLE){
    ACE_Message_Block *mb;
    ACE_Time_Value nowait (ACE_OS::gettimeofday ());
    if(-1 != this->getq (mb, &nowait)){                        //这里用while还是if好些,对于一个putq相当快的线程
       int recv_cnt = mb->length();
       ssize_t send_cnt = this->peer ().send(mb->rd_ptr (), mb->length ()); //因为send相对来说比较费时
       if(send_cnt == -1 && ACE_OS::last_error() != EWOULDBLOCK){
         return -1;
      }else{
            if(send_cnt == -1){
               send_cnt = 0;
            }
            mb->rd_ptr (static_cast (send_cnt));
      }
      if(mb->length () > 0) {
             this->ungetq (mb);
             return 1;
      }
       mb->release ();
/*                                                 //是否需要sleep来,对CPU占用缓解有没有更好的方法
ACE_Time_Value tv(0, 100);
ACE_OS::sleep(tv);
*/
    }
    if (this->msg_queue ()->is_empty())
         this->reactor()->cancel_wakeup(this, ACE_Event_Handler::WRITE_MASK);
    else
         this->reactor ()->schedule_wakeup(this, ACE_Event_Handler::WRITE_MASK);
    return 0;
}

peakzhang 发表于 2007-12-31 22:37:08

有问题,发送失败后,有内存泄漏,没有调用mb->release();

另外,完全不需要:
/*                                                
ACE_Time_Value tv(0, 100);
ACE_OS::sleep(tv);
*/
上面直接改成while循环,取数据失败后再退出即可。这是程序员指南上的例子改的吧?
页: [1]
查看完整版本: 关于ACE服务端编写的高效问题的一些讨论