ACE主动对象模式

  ACE主动对象模式解决的核心问题是,异步调用及线程context的切换。ACE主动对象的实现侧重于类代码段的并发访问,这种访问模式仅适合短小的处理流程,比如socket的accept请求,或者webservice调用。如果代码段处理响应速度大于请求到达速度,异步访问队列将很快被访问请求填充满,带来后续请求无法及时响应的问题。

  ACE主动对象模式实现至少涉及3个类模块:

  1:提供多线程池ACE_Task_Base或者ACE_Task或者ACE_Thread_Manager

  2:提供请求排队的ACE_Activation_Queue,其内部维护了ACE_Message_Queue的message_block消息指针队列

  3:提供了ACE_Activation_Queue队列操作实例的ACE_Method_Request,ACE_Method_Request是command模式,最低消耗仅为实现其内部的call方法。

  ACE主动对象实现需要依赖以上3个模块,至少构建2个类

  1:分发器,负责将请求参数排队,并提供数个执行线程。

  2:分发对象。请求队列的排队实例。

  看一下主动对象模式实现,以下为最精简代码:

 //////////////////////////////////////////////////////////////////////////
//分发器定义
class CActivateDispatch: public ACE_Task<ACE_MT_SYNCH>
{
public:
virtual int open (void *args = ) ;
virtual int svc(void) ;
void push();
private:
ACE_Activation_Queue cmdQueue; // 命令队列
};
//////////////////////////////////////////////////////////////////////////
//分发对象定义
class CActivateObject: public ACE_Method_Request
{
public:
CActivateObject(CActivateDispatch *pDispatch) ;
public:
int call() ;
private:
CActivateDispatch* m_pDispatch ;
};
//////////////////////////////////////////////////////////////////////////
//分发器实现
int CActivateDispatch::open (void *args)
{
//创建数个线程
return activate (THR_NEW_LWP|THR_JOINABLE, ACE_OS::num_processors() + );
}
void CActivateDispatch::push()
{
//生成命令对象,插入到命令队列中
if(cmdQueue.is_full())
ACE_DEBUG((LM_WARNING,"[%D(%t)] queue full , put away the object\n"));
else
cmdQueue.enqueue(new CActivateObject(this));
}
int CActivateDispatch::svc ( )
{
while(true)
{
//遍历命令队列,执行命令
auto_ptr<ACE_Method_Request> mo(this->cmdQueue.dequeue ());
if (mo->call () == -)
break;
}
return ;
}
void CActivateDispatch::call()
{
//do something,执行环境已切换到线程上下文
}
//////////////////////////////////////////////////////////////////////////
//分发对象实现
CActivateObject::CActivateObject(CActivateDispatch *pDispatch)
{
//分发对象构造函数
this->m_pDispatch = pDispatch;
}
int CActivateObject::call()
{
//执行环境已切换到线程上下文
if(m_pOB == NULL )
return -;
m_pDispatch->call();
return ;
}

 

ACE主动对象模式的更多相关文章

  1. ACE 主动对象模式的按部就班的实现方法

    ACE的主动对象模式的实现 对分布式系统设计来说,ACE提供的主动对象模式是让我们在系统框架构建的时候,回归到传统的单线程编程思维.你可能要问,既然有主动对象,那必然有被动对象,没有错,确实有被动对象 ...

  2. ACE主动对象模式(2)

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/12/590153.html 我们简单的介绍了一下ACE主动对象实现方式,同时提出了两个问题: ...

  3. ACE主动对象模式(1)

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/11/589168.html 主动对象模式用于降低方法执行和方法调用之间的耦合.该模式描述了另外 ...

  4. 设计模式- 主动对象(Active Object)

    译者注:1.对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为.在多线程程序中,经常把一个线程封装到主动对象里面.2.在 ...

  5. 空对象模式(Null Object Pattern)

    空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...

  6. ASP.NET设计模式(一)、适配器模式、依赖注入依赖倒置、空对象模式

    鸟随凤鸾,人伴贤良,得以共之,我之幸也.说的是鸟随着鸾凤可以飞的更高远,人和比自己境界高的相处,自己也会得到熏染进步. 一.概述 分享出来简单的心得,望探讨 依赖倒置 依赖注入 Adapter模式 N ...

  7. 【设计模式 - 21】之空对象模式(Null Object)

    1      模式简介 在空对象模式中,一个空对象取代NULL对象的实例的检查.NULL对象不是检查空值,而是反映一个不做任何动作的关系.这样的NULL对象也可以在数据不可用的时候提供默认的行为. 在 ...

  8. 设计模式:空对象模式(Null Object Pattern)

    设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...

  9. C# 设计模式之空对象模式

    最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正. 今天先说说我个人觉得最简单的设计模式 -- [空对象模式] 空对象模式可以减少客户端对对象 ...

随机推荐

  1. CSS如何清除浮动流的多种方案

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. ehcarts之toolbox,工具栏

    toolbox 工具栏.内置有导出图片,数据视图,动态类型切换,数据区域缩放,重置五个工具. feature各工具配置项.具体显示功能 1.saveAsImage 保存为图片. 2.restore 还 ...

  3. Token bucket

    w https://en.wikipedia.org/wiki/Token_bucket

  4. python系列十四:Python3 文件

    #!/usr/bin/python #Python3 文件 from urllib import requestimport pprint,pickle'''读和写文件open() 将会返回一个 fi ...

  5. 根据字段表 自动创建 表SQL

    create PROC CreateTableSql ) AS ) ,) ,) ) ,) ,) ,@IsIdentity bit ,@IsNull bit ,@IsPrimaryKey bit ),) ...

  6. C#反射 程序域

    1:加载dll到当前应用程序域: public static void LoadAllAssembly(string bindir) //bindir是dll所在的完整路径 { List<Ass ...

  7. VMware Workstation 虚拟机纯 Linux 终端如何安装 VMware Tools ?

    VMware Workstation 虚拟机纯 Linux 终端如何安装 VMware Tools ? 1.首先在虚拟机设置里面设置一个共享文件夹 2.在虚拟机菜单栏中选择 VMware Tools ...

  8. 前端基础 & 初识JS(JavaScript)

    JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中),后将其改名ScriptEase(客 ...

  9. return和yield的区别

    # return 返回给调用者值,并结束此函数.#yiled 返回给调用者值,并将指针停留着当前位置.

  10. Android系统移植与调试之------->build.prop文件详细赏析

    小知识:什么是build.prop?   /system/build.prop 是一个属性文件,在Android系统中.prop文件很重要,记录了系统的设置和改变,类似於/etc中的文件.这个文件是如 ...