找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3850|回复: 1

Dev_Poll_Reactor到底支不支持多线程

[复制链接]
发表于 2008-1-27 20:38:31 | 显示全部楼层 |阅读模式
我大致看了下Dev_Poll_Reactor的实现源码,内部有个锁的,但它到底在多线程下是不是安全的?

我写了一个简单的Demo,已经确保了所有的代码全部Reactor内部运行,但还是会出现程序崩溃的现象。

代码非常简单,在多个线程中执行
  while(1)
   ACE_Reactor::instance()->handle_events();

运行情况是这个的,如果只有一个线程在做上面的循环,则一切正常,跑了很久都没事,但如果在多个线程中做上面的循环,则很快就崩溃了。
事件处理:只是把收到的包原样送回去,参考的都是书上的Demo

int CSessionHandler::handle_input(ACE_HANDLE h)
{
  ssize_t bytes_transferred = peer().recv(buf_, ONE_PACKET_SIZE);
  if (bytes_transferred <= 0)
  {
    return -1;  
  }
  else
  {
    ACE_Message_Block* mb = NULL;
    ACE_NEW_NORETURN(mb, ACE_Message_Block(bytes_transferred));
    mb->copy(buf_, bytes_transferred);

    ACE_Time_Value nowait(ACE_OS::gettimeofday());
    if (putq(mb, &nowait) == -1)
    {
      mb->release();
      return -1;
   }
   if (this->msg_queue()->message_count() == 1)
   {
     this->reactor()->register_handler(this, ACE_Event_Handler::WRITE_MASK);
   }  
  }
  return 0;
}

int CSessionHandler::handle_output(ACE_HANDLE fd /* = ACE_INVALID_HANDLE */)
{
  ACE_Message_Block* mb = NULL;
  ACE_Time_Value nowait(ACE_OS::gettimeofday());
  while (-1 != this->getq(mb, &nowait))
  {
    ssize_t send_cnt = peer().send(mb->rd_ptr(), mb->length());
    if (-1 == send_cnt)
    {
      ACE_OS::printf("Send data error!\n");
    }
    else
    {
      mb->rd_ptr(send_cnt);
    }
    if (mb->length() > 0)
    {
      this->ungetq(mb);
      break;
    }
    mb->release();
  }
  return msg_queue()->is_empty()? -1 : 0;
}

int CSessionHandler::handle_close(ACE_HANDLE h, ACE_Reactor_Mask mask)
{
  if (mask == ACE_Event_Handler::WRITE_MASK)
  {
    return -1;
  }
  return supper::handle_close(h, mask);
}

到底是怎么回事,该怎么处理,请高手指点。
发表于 2008-1-30 02:08:49 | 显示全部楼层
代码非常简单,在多个线程中执行
  while(1)
   ACE_Reactor::instance()->handle_events();
I don't think this is right. You need TP
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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