最近解决了以前遗留ACE问题(原来应用退出时实际上各子线程不是自然退出而是进程终止而强制退出)高兴!特此记录下
我们应用使用反应器框架模式反应器框架通过任务消息队列和具体处理任务解耦任务(继承自ACE_Task)线程通过getq获取消息内容并处理
原来类似于下面:
My_Task::open(void* args)
{
activate(THR_NEW_LWP | THR_JOINABLE, 5, 1);//打开5个工作者线程
0;
}
My_Task::svc
{
while ( 0m_nEnd ) //m_nEnd结束标记为1时退出线程
{
ACE_Message_Block *mb =0;
try{
getq(mb);
...
}
}
}
实际上即使有设置结束标记上面办法也不能自然退出并不是每个任务工作者线程getq都有结果(有处于饥饿状态就会直阻塞在getq上造成不能自然退出)
可以这样改下:
//任务有很多所以写成宏方便主要是为getq设置1秒超时
# MY_GETQ(X) \
ACE_Time_Value tvTmp = ACE_OS::gettimeofday ;\
tvTmp ACE_Time_Value(1);\
getq(X, &tvTmp);\
(X NULL)\
continue;
...
My_Task::svc
{
while ( 0m_nEnd ) //m_nEnd结束标记
{
ACE_Message_Block *mb =0;
try{
MY_GETQ(mb);
...
}
}
}
再查看了下ACE例程发现有用了超时办法有用这个来判断是否退出:
virtual svc (void)
{
while (1)
{
ACE_Message_Block *mb = NULL;
(this->getq (mb) -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%t) Shutting down\n")));
;
}
// Process the message.
process_message (mb);
}
0;
}
不过就有个问题什么情况下getq会返回-1 ?
最新评论