ACE_Task自然退出的问题
来源:优易学  2011-12-6 11:45:33   【优易学:中国教育考试门户网】   资料下载   IT书店
  最近解决了以前遗留的ACE问题(原来的应用退出时实际上各子线程不是自然退出,而是因为进程终止而强制退出的),高兴!特此记录一下。
  我们的应用使用反应器框架模式,反应器框架通过任务的消息队列和具体处理任务解耦,青年人网提示任务(继承自ACE_Task)线程通过getq获取消息内容并处理。
  原来的程序类似于下面:
  int My_Task::open(void* args)
  {
  activate(THR_NEW_LWP | THR_JOINABLE, 5, 1);//打开5个工作者线程
  return 0;
  }
  int My_Task::svc()
  {
  while ( 0==m_nEnd ) //m_nEnd结束标记,为1时退出线程
  {
  ACE_Message_Block *mb =0;
  try{
  getq(mb);
  ...
  }
  }
  }
  实际上即使有设置结束标记,上面的办法也不能自然退出,因为并不是每个任务工作者线程getq都有结果(有的处于饥饿状态,青年人网提示会一直阻塞在getq上,造成不能自然退出)。
  可以这样改下:
  //任务有很多,所以写成宏方便调用,主要是为getq设置1秒超时
  #define MY_GETQ(X) \
  ACE_Time_Value tvTmp = ACE_OS::gettimeofday ();\
  tvTmp += ACE_Time_Value(1);\
  getq(X, &tvTmp);\
  if (X == NULL)\
  continue;
  ...
  int My_Task::svc()
  {
  while ( 0==m_nEnd ) //m_nEnd结束标记
  {
  ACE_Message_Block *mb =0;
  try{
  MY_GETQ(mb);
  ...
  }
  }
  }
  再查看了一下ACE例程,发现有的用了超时的办法,有的用这个来判断是否退出:
  virtual int svc (void)
  {
  while (1)
  {
  ACE_Message_Block *mb = NULL;
  if (this->getq (mb) == -1)
  {
  ACE_DEBUG ((LM_INFO,
  ACE_TEXT ("(%t) Shutting down\n")));
  break;
  }
  // Process the message.
  process_message (mb);
  }
  return 0;
  }
  不过就有一个问题,什么情况下getq会返回-1 ?

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训