ACE主动对象模式
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主动对象模式的更多相关文章
- ACE 主动对象模式的按部就班的实现方法
ACE的主动对象模式的实现 对分布式系统设计来说,ACE提供的主动对象模式是让我们在系统框架构建的时候,回归到传统的单线程编程思维.你可能要问,既然有主动对象,那必然有被动对象,没有错,确实有被动对象 ...
- ACE主动对象模式(2)
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/12/590153.html 我们简单的介绍了一下ACE主动对象实现方式,同时提出了两个问题: ...
- ACE主动对象模式(1)
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/11/589168.html 主动对象模式用于降低方法执行和方法调用之间的耦合.该模式描述了另外 ...
- 设计模式- 主动对象(Active Object)
译者注:1.对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为.在多线程程序中,经常把一个线程封装到主动对象里面.2.在 ...
- 空对象模式(Null Object Pattern)
空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...
- ASP.NET设计模式(一)、适配器模式、依赖注入依赖倒置、空对象模式
鸟随凤鸾,人伴贤良,得以共之,我之幸也.说的是鸟随着鸾凤可以飞的更高远,人和比自己境界高的相处,自己也会得到熏染进步. 一.概述 分享出来简单的心得,望探讨 依赖倒置 依赖注入 Adapter模式 N ...
- 【设计模式 - 21】之空对象模式(Null Object)
1 模式简介 在空对象模式中,一个空对象取代NULL对象的实例的检查.NULL对象不是检查空值,而是反映一个不做任何动作的关系.这样的NULL对象也可以在数据不可用的时候提供默认的行为. 在 ...
- 设计模式:空对象模式(Null Object Pattern)
设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...
- C# 设计模式之空对象模式
最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正. 今天先说说我个人觉得最简单的设计模式 -- [空对象模式] 空对象模式可以减少客户端对对象 ...
随机推荐
- B - The Suspects(并查集)
B - The Suspects Time Limit:1000MS Memory Limit:20000KB 64bit IO Format:%lld & %llu Desc ...
- python多线程(三)
同步锁 两个需要注意的点: 线程抢的是GIL锁,GIL锁相当于执行权限,拿到执行权限后才能拿到互斥锁Lock,其他线程也可以抢到GIL,但如果发现Lock仍然没有被释放则阻塞,即便是拿到执行权限GIL ...
- 我的Android进阶之旅------>Android的ListView数据更新后,如何使最新的条目可以自动滚动到可视范围内?
在ListView的layout配置中添加 android:transcriptMode="alwaysScroll" <ListView android:id=" ...
- java 抽象类实现接口
1.抽象类肯定可以实现接口: 2.这不是有没有意义的事情,是一种思想,当你自己写的类想用接口中个别方法的时候(注意不是所有的方法),那么你就可以用一个抽象类先实现这个接口(方法体中为空),然后再用你 ...
- Parzen-Window Density Estimation(PWDE)
1.概率密度函数 在在数学中,连续型随机变量的概率密度函数(在不至于混淆时可以简称为密度函数)是一个描述这个随机变量的输出值,在某个确定的取值点附近的可能性的函数.而随机变量的取值落在某个区域之内的概 ...
- MySQL的SQL MODE
SQL MODE:定义mysqld对约束等的响应行为: 查看当前模式: mysql> SHOW GLOBAL VARIABLES LIKE 'sql_mode'; 修改 ...
- 纯HTML标签详解(摘自阿里西西)
HTML标签很多,可是实际上常用的却就那么十几二十个,很多标签的功能渐渐的被大家忽略了.然后,如果在适当的时候,用一用,还是能在一定程序上给我们的页面设计带来一点小小的方便的.下面这些HTML标签基本 ...
- sublime text C++
几乎每一门编程语言都是从"Hello, world!"学起的, 刚学编程的时候感觉有点枯燥, 对它不够重视. 可是到后来慢慢发现, 几乎我学到的每一个知识点, 在最开始都是经过 h ...
- mysql安装配置 (单个mysql安装)
mysql安装于 c盘因为有注册文件 和注册表 1.为了防止mysql数据表变大和sql日志增加 改变C:\ProgramData\MySQL\MySQL Server 5.7\my.ini 得指 ...
- BFC与边距重叠详解
1.什么是BFC? 在解释 BFC 是什么之前,需要先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位Box 是 CSS 布局的对象和基本单位, 直观点来说, ...