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 }

 

原文地址:https://www.cnblogs.com/hgwang/p/6732426.html