ACE_Task虚函数
我在ACE资料上看到关于ACE_Task的描述:Task的子类还必须定义put和svc方法。这些方法在消息上执行应用特有的处理功能。例如,当消息到达流的头或尾时,作为调用流中的每个任务的put和/或svc方法的结果,它们被“护送”通过一系列互连的任务。
关于提到的put方法,我有点不明白。这个put方法我理解就是消息入队的方法。它和putq有区别吗? 记得是putq的包装。可以看源码。 put和svc是task的两种服务方式。
put中代码借用调用者的线程执行。svc代码则在另外的线程中执行。
put一般会调用putq(这个我也不知道为什么这么设计)。 观察源代码,可知。
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就万无一失了。 回去看了下书,书上的说法是:
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的方式)。
页:
[1]