C++技巧(ACE,第1张

C++技巧(ACE,第2张

最近解决了过去遗留的ACE问题(原应用退出时,其实所有子线程都是自然退出,只是因为进程终止而被迫退出)。开心!这里有一张唱片。
我们的应用程序使用反应器框架模式。reactor框架将任务的消息队列与具体的处理任务解耦,test,big prompt task(继承自ACE_Task)线程获取消息内容并通过getq进行处理。
原程序类似如下:
int my _ task::open(void * args)
{
activate(thr _ new _ lwp | thr _ join able,5,1);//打开5个工作线程
返回0;
}
int my _ task::SVC()
{
while(0 = = m _ nend)//m _ nend结束标记,为1
{
ace
try {
getq(MB)时退出线程;
...
}
}
其实即使设置了结束标志,上面的方法也不能自然退出,因为并不是每个任务工作者线程getq都有结果(有的是饿了,大提示在getq上总会被屏蔽,所以不能自然退出)。
可以这样改:
//任务很多,很容易作为宏调用,主要是为getq
# definemy _ getq(x)\
ACE _ Time _ valuetvtmp = ACE _ OS::gettime of Day(\
tvTmp+= ACE _ Time _ Value(1)设置1秒超时;\
getq(X,& tvTmp);\
if(X = = NULL)\
continue;
...
int MY _ task::SVC()
{
while(0 = = m _ nend)//m _ nend end mark
{
ace _ message _ message
try {
MY _ GETQ(MB);
...
}
}
再看ACE例程,发现他们有的用了超时方法,有的用它来判断是否退出:
Virtual int SVC(void)
{[/br]
if(this-> getq(MB)= =-1)
{
ACE _ DEBUG((LM _ INFO,
ACE _ TEXT("(% t)shunding \ n "))
break;
}
//处理消息。
process _ message(MB);
}
返回0;
}
但是只有一个问题。getq在什么情况下会返回-1?

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++技巧(ACE

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情