zoukankan      html  css  js  c++  java
  • 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:分发对象。请求队列的排队实例。

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

     1 //////////////////////////////////////////////////////////////////////////
     2 //分发器定义
     3 class CActivateDispatch: public ACE_Task<ACE_MT_SYNCH>
     4 {
     5 public:
     6     virtual int open (void *args = 0) ;
     7     virtual int svc(void) ;
     8     void        push();
     9 private:
    10     ACE_Activation_Queue cmdQueue;  // 命令队列
    11 };
    12 //////////////////////////////////////////////////////////////////////////
    13 //分发对象定义
    14 class CActivateObject: public ACE_Method_Request
    15 {
    16 public:
    17     CActivateObject(CActivateDispatch *pDispatch) ;
    18 public:
    19     int call() ;
    20 private:
    21     CActivateDispatch*      m_pDispatch ;
    22 };
    23 //////////////////////////////////////////////////////////////////////////
    24 //分发器实现
    25 int CActivateDispatch::open (void *args)
    26 { 
    27     //创建数个线程
    28     return activate (THR_NEW_LWP|THR_JOINABLE, ACE_OS::num_processors() + 2); 
    29 }
    30 void  CActivateDispatch::push()
    31 {
    32     //生成命令对象,插入到命令队列中
    33     if(cmdQueue.is_full())
    34         ACE_DEBUG((LM_WARNING,"[%D(%t)] queue full , put away the object
    "));
    35     else
    36         cmdQueue.enqueue(new CActivateObject(this));
    37 }
    38 int CActivateDispatch::svc ( )
    39 {
    40     while(true)
    41     {
    42         //遍历命令队列,执行命令
    43         auto_ptr<ACE_Method_Request> mo(this->cmdQueue.dequeue ());
    44         if (mo->call () == -1)
    45             break;
    46     }
    47     return 0 ;
    48 }
    49 void CActivateDispatch::call()
    50 {
    51     //do something,执行环境已切换到线程上下文
    52 }
    53 //////////////////////////////////////////////////////////////////////////
    54 //分发对象实现
    55 CActivateObject::CActivateObject(CActivateDispatch *pDispatch)
    56 {
    57     //分发对象构造函数
    58     this->m_pDispatch   = pDispatch;
    59 }
    60 int CActivateObject::call()
    61 {
    62     //执行环境已切换到线程上下文
    63     if(m_pOB == NULL )
    64         return -1;
    65     m_pDispatch->call();
    66     return 0;
    67 }

     

  • 相关阅读:
    eclipse ve 问题
    NHibernate配置
    JDOM/XPATH编程指南
    win2003的IIS配置的陷阱
    关于setInterval的用法
    用Visio来做工作流定义工具
    分类算法要解决的问题
    win2003 运行 aspx程序出现Temporary ASP.NET Files 访问被拒绝 的解决方法
    ado recordset的一个陷阱
    为ServerXMLHTTP对象的HTTP请求设置超时时间
  • 原文地址:https://www.cnblogs.com/hgwang/p/6732426.html
Copyright © 2011-2022 走看看