找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5080|回复: 2

一个很简单的问题,ACE_Task已经suspend了还能putq么?

[复制链接]
发表于 2007-12-12 23:52:56 | 显示全部楼层 |阅读模式
我想让这个线程在没有消息的时候就自动挂起来,有消息的时候再resume,于是就写
blablablabla....
  1. if ( this->getq( mb, &tv ) == -1 )
  2. {
  3. suspend();
  4. continue;
  5. }
复制代码
那么到底应该是resume(); putq( mb ); 还是putq( mb ); resume(); 呢?
 楼主| 发表于 2007-12-12 23:53:10 | 显示全部楼层
去掉getq的tv参数,Task会自动挂起,如果按照你的操作,这个太麻烦了。
 楼主| 发表于 2007-12-12 23:53:16 | 显示全部楼层
1、ACE_Task的getq和putq调用所访问的是其内部的ACE_Message_Queue对象,与是否激活Task的的线程没有直接联系,所以不管Task是否激活了线程,也不管线程是suspend了还是resume了,getq和putq都不受影响。

2、你要实现的逻辑和你的代码是背道而驰的,最常见的解决方案应该是:

由putq的线程发送signal给Task,Task在handle_signal中resume线程,然后线程调用getq获取队列中的资源并处理,检查ACE_Message_Queue是否为空,不为空则继续循环调用getq并处理,为空则suspend线程。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-23 15:33 , Processed in 0.016996 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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