peakzhang 发表于 2007-12-12 23:52:56

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

我想让这个线程在没有消息的时候就自动挂起来,有消息的时候再resume,于是就写
blablablabla....
if ( this->getq( mb, &tv ) == -1 )
{
suspend();
continue;
}

那么到底应该是resume(); putq( mb ); 还是putq( mb ); resume(); 呢?

peakzhang 发表于 2007-12-12 23:53:10

去掉getq的tv参数,Task会自动挂起,如果按照你的操作,这个太麻烦了。

peakzhang 发表于 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线程。
页: [1]
查看完整版本: 一个很简单的问题,ACE_Task已经suspend了还能putq么?