ACE_Task自然退出的问题

本文介绍了解决ACE框架中线程无法自然退出的问题。通过改进getq方法实现超时处理,确保线程能够响应退出信号。同时探讨了不同退出机制及getq返回-1的原因。
部署运行你感兴趣的模型镜像

最近解决了以前遗留的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 ?

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值