最近解决了以前遗留的ACE问题(原来的应用退出时实际上各子线程不是自然退出,而是因为进程终止而强制退出的),高兴!特此记录一下。
我们的应用使用反应器框架模式,反应器框架通过任务的消息队列和具体处理任务解耦,任务(继承自ACE_Task)线程通过getq获取消息内容并处理。
原来的程序类似于下面:
int My_Task::open(void* args)
{
activate(THR_NEW_LWP | THR_JOINABLE, 5, 1);//打开5个工作者线程
return 0;
}
int My_Task::svc()
{
while ( 0==m_nEnd ) //m_nEnd结束标记,为1时退出线程
{
ACE_Message_Block *mb =0;
try{
getq(mb);
...
}
}
}
实际上即使有设置结束标记,上面的办法也不能自然退出,因为并不是每个任务工作者线程getq都有结果(有的处于饥饿状态,就会一直阻塞在getq上,造成不能自然退出)。
可以这样改下:
//任务有很多,所以写成宏方便调用,主要是为getq设置1秒超时
#define MY_GETQ(X) /
ACE_Time_Value tvTmp = ACE_OS::gettimeofday ();/
tvTmp += ACE_Time_Value(1);/
getq(X, &tvTmp);/
if (X == NULL)/
continue;
...
int My_Task::svc()
{
while ( 0==m_nEnd ) //m_nEnd结束标记
{
ACE_Message_Block *mb =0;
try{
MY_GETQ(mb);
...
}
}
}
再查看了一下ACE例程,发现有的用了超时的办法,有的用这个来判断是否退出:
virtual int svc (void)
{
while (1)
{
ACE_Message_Block *mb = NULL;
if (this->getq (mb) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%t) Shutting down/n")));
break;
}
// Process the message.
process_message (mb);
}
return 0;
}
不过就有一个问题,什么情况下getq会返回-1 ?
分享到:
相关推荐
在Linux平台上,在未设置ACE_Task::putq()的timeout参数时,若此时队列满,putq则进入等待状态,即线程休眠,本文主要结合一个具体的例子详细讲解该过程,涉及到ACE代码,glibc,以及linux Kernel的分析。...
ACE_Thread.txt ACE_Thread.txt ACE_Thread.txt ACE_Thread.txt ACE_Thread.txt ACE_Thread.txtACE_Thread.txt ACE_Thread.txt ACE_Thread.txt ACE_Thread.txt
本篇文章是对利用ace的ACE_Task等类实现线程池的方法进行了详细的分析介绍,需要的朋友参考下
HI0022E_amba_axi_and_ace_protocol_spec.pdfHI0022E_amba_axi_and_ace_protocol_spec.pdf
static __time64_t __cdecl _make__time64_t ( struct tm *tb, int ultflag ) { __time64_t tmptm1, tmptm2, tmptm3; struct tm tbtemp; long dstbias = 0;... long timezone = 0;...= NULL ), EINVAL, ( ( __time64...
ACE_wrappers22222222
ACE_wrappers11111111
ACE_wrappers 5.7类库 使用CodeBlocks 8.02 gcc 3.4.5编译的Release版本 文件列表 libACE.dll.a,libACE.dll,libACE_ETCL.dll,libACE_ETCL_Parser.dll,libACE_Monitor_Control.dll
ACE_OS命名空间函数参考文档 用ACE跨平台最常用的系统函数
使用ACE_Proactor进行TCP通信的示例代码。
ACE_Proactor TCP协议通信示例代码
一个ACE写的服务器端,可以连接多个用户,并处理其请求
使用ACE 搭建的TCP服务器和客户端框架。简洁明了,可以扩充。
ACE JS lite framework | 轻量级JS核心开发框架
ACE默认生成的库是标准库版,现在有生成好了的ACE的MFC版本,实用于VC++2005
ACE数据的传输,使用ACE代码编写,实现数据的传输
axi协议官方版,适合学习axi4,axi3 axilite axistream的学生和工程师研究学习
2016 最近版本的ace-admin 1.3.4 亲测通过,给个好评