找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3620|回复: 4

ACE_Task虚函数

[复制链接]
发表于 2009-7-4 11:33:42 | 显示全部楼层 |阅读模式
我在ACE资料上看到关于ACE_Task的描述:
Task的子类还必须定义put和svc方法。这些方法在消息上执行应用特有的处理功能。例如,当消息到达流的头或尾时,作为调用流中的每个任务的put和/或svc方法的结果,它们被“护送”通过一系列互连的任务。

关于提到的put方法,我有点不明白。这个put方法我理解就是消息入队的方法。它和putq有区别吗?
发表于 2009-7-4 14:08:34 | 显示全部楼层
记得是putq的包装。可以看源码。
发表于 2009-7-4 16:02:31 | 显示全部楼层
put和svc是task的两种服务方式。
put中代码借用调用者的线程执行。svc代码则在另外的线程中执行。
put一般会调用putq(这个我也不知道为什么这么设计)。
发表于 2009-7-4 18:53:46 | 显示全部楼层
观察源代码,可知。
ACE的设计者原本的意图应该是这样的,
将ACE_Task提供的putq,getq等函数的属性封装成protected,
仅对外暴露基类ACE_Task_Base的public接口如svc与put,
(这里svc与put并没有声明称为纯虚的函数,而是默认提供了return 0的实现)
使用者应该在ACE_Task的派生类如My_Task内重写svc与put函数。

看put的函数注释说明可知,put原本应该被设计为提供这样的能力,
可以在调用者的上下文中被立刻处理,或者在svc的上下文中被处理,
只是出于实际需要,我们很少在调用者的上下文中做处理罢了。
/// A hook method that can be used to pass a message to a
/// task, where it can be processed immediately or queued for subsequent
/// processing in the <svc> hook method.

并且出于某种原因,最终ACE_Task提供的这些本来被设置为protected属性
的函数如putq,getq,最终被设置为public属性,看下面的源代码注释
public: // Should be protected:
  // = Message queue manipulation methods.
  // = Enqueue and dequeue methods.

由于ACE并没有对此作出明确的解释,因此导致我们使用的时候,会感到很迷惑。
为了考虑日后ACE的有可能的变化,我们使用的最外层接口最好put。
然后在put内部简单的调用一下this->putq就万无一失了。
发表于 2009-7-5 15:29:08 | 显示全部楼层
回去看了下书,书上的说法是:
Task提供了两种处理模式:passive porcess和active process
passive process是steal the caller's thread,进行处理。然后如果需要进一步active process则调用putq,交给svc,否则不必。
active process 是用户把要处理的信息putq,svc进行getq在new thread中处理。

个人觉得这个名字put起的不好,不能准确表达这个方法的意图。
ACE有很多起名不好(如owner())和语义不清容易混淆的地方(如handle_timeout()和handle_time_out()等),这影响了它的代码可读性和易用性。前几天刚看到别的论坛有人评价说ACE过于晦涩难懂,这点可以考虑向java库的一些做法学习一下,使用清晰易懂的接口,并逐渐取缔原接口(用标志obsolete的方式)。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 04:01 , Processed in 0.017009 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表