|
楼主 |
发表于 2007-12-24 23:15:09
|
显示全部楼层
谢谢winston:
我在消息里保存了要关闭的线程ID,消息类型为:MB_STOP,想让指定的线程收到该消息,按您上面说得方法把消息重新推入队列,是关闭所有线程。但是如果putq()之后不关闭本线程(没有break语句),其他的线程还是收不到这个消息,一直都是他自己收的,其他线程怎么不能收呢?
代码如下, 帮忙看下好么?
int svc(void)
{
while(1)
{
ACE_Message_Block *mb = NULL;
if(this->getq(mb) == -1)
{
ACE_OS::sleep(wait_time);
continue;
}
// 关闭指定的线程
if(mb->msg_type() == ACE_Message_Block::MB_STOP)
{
ACE_thread_t thrd_id;
memcpy(&thrd_id, mb, sizeof(ACE_thread_t));
log_printf("CTask_Worker: [%d] get stop message [%d].\n", ACE_OS::thr_self(), thrd_id);
if(ACE_OS::thr_equal(ACE_OS::thr_self(), thrd_id))
{
mb->release();
break;
}
else
{
if (this->putq (mb) == -1)
{
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("Task::svc() putq")));
mb->release ();
}
}
}
return 0;
} |
|