一个很简单的问题,ACE_Task已经suspend了还能putq么?
我想让这个线程在没有消息的时候就自动挂起来,有消息的时候再resume,于是就写blablablabla....
if ( this->getq( mb, &tv ) == -1 )
{
suspend();
continue;
}
那么到底应该是resume(); putq( mb ); 还是putq( mb ); resume(); 呢? 去掉getq的tv参数,Task会自动挂起,如果按照你的操作,这个太麻烦了。 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]