TProactor浅析二

TProactor源码浅析二

     为了模拟Proactor,必须要提供异步操作和异步操作结果的表示方法,TProactor对这点的处理相当复杂化,而且对异步操作进行了细分,复杂化了,下面来简要描述一下。

异步操作的表示

首先是异步操作的表示,这就是TRB_Asynch_Operation基类,TProactor为不同的异步操作类型定义了不同的类,分为:
TRB_Asynch_Read_Stream类,读操作;
TRB_Asynch_Write_Stream类,写操作;
TRB_Asynch_Accept类,接受连接操作;
TRB_Asynch_Connect类,发起连接操作等;
等等。
TRB_Asynch_Operation类的几个关键成员:
TRB_Handler   *handler_ 服务完成处理程序;
ACE_HANDLE  handle_ 表示是哪个handle上的异步事件;
TRB_Proactor  *proactor_ 表示该异步事件是在哪个proactor上;
const void    * completion_key_ 用户自定义的完成键,想想Win32 IOCP的completion key;

TRB_Asynch_Operation极其派生类的声明和定义都类位于源文件:Asynch_IO.h和Asynch_IO.cpp中;
下面是异步操作的表示类层次图,继承层次相对简单。
 result

异步操作结果的表示

对应于异步操作,还需要表示异步操作结果的类,这就是TRB_Asynch_Result类,同样的也细分为各种表示具体操作结果的类,继承自TRB_Asynch_Result类。
TRB_Asynch_Read_Stream_Result类,读操作结果;
TRB_Asynch_Write_Stream_Result类,写操作结果;
TRB_Asynch_Accept_Result类,接受连接操作结果;
TRB_Asynch_Connect_Result类,发起连接操作等结果;
等等。
TRB_Asynch_Result极其子类都位于源文件:Asynch_IO.h和Asynch_IO.cpp中;

TRB_Asynch_Result类的几个关键成员:
TRB_Handler       *handler_ 服务完成处理程序;
ACE_HANDLE      handle_ 表示是哪个handle上的异步事件;
它们都直接取自对应的异步操作(TRB_Asynch_Operation)对象。

异步操作结果的平台无关性封装

除了这些类,还有一批表示异步操作结果的类,在POSIX平台上,它们继承自同一个基类TRB_POSIX_Asynch_Result(对应于Win32则是TRB_Win32_Asynch_Result)。
TRB_POSIX_Asynch_Read_Stream_Result类,读操作结果;
TRB_ POSIX_Asynch_Write_Stream_Result类,写操作结果;
TRB_ POSIX_Asynch_Accept_Result类,接受连接操作结果;
TRB_ POSIX_Asynch_Connect_Result类,发起连接操作等结果;

TRB_POSIX_Asynch_Result和TRB_Win32_Asynch_Result是TRB_Asynch_Result_Impl类的子类,它的子类必须实现接口:
virtual TRB_Asynch_Result & get_original_result () = 0;来获取异步操作结果的对象;
TRB_Asynch_Result_Impl类在源文件Asynch_IO_Impl.h和Asynch_IO_Impl.cpp中声明和定义;
TRB_POSIX_Asynch_Result类及其派生类的声明和定义都位于源文件:POSIX_Asynch_IO.h和POSIX_Asynch_IO.cpp中;

相当繁琐吧,TRB_Asynch_Result系列和TRB_POSIX_Asynch_Result系列有什么关联呢?个人也感觉这种设计很混乱,下面就来简单说说。
     首先:上面讲过TRB_POSIX_Asynch_Result系列通过get_original_result () = 0;来获取异步操作结果的对象;
     再者:而Proactor类会导出一系列的create_result_impl()接口,从而根据TRB_Asynch_Result系列对象创建TRB_Asynch_Result_Impl系列对象;比如POSIX_Proactor类中:
virtual TRB_Asynch_Result_Impl *create_result_impl (const TRB_Asynch_Read_Stream_Result & result);
该函数根据传入的TRB_Asynch_Read_Stream_Result对象result,调用create_posix_result函数,直接创建TRB_POSIX_Asynch_Read_Stream_Result对象,看代码:
return create_posix_result<TRB_POSIX_Asynch_Read_Stream_Result>
                          (result,
                           &this->allocator11_,
                           this);
引入TRB_Asynch_Result_Impl的目的也是为了平台无关性的封装,最后看看这些类的层次和关系图:
 result 2

至于异步操作和异步操作结果之间的联系,下节就能涉及到,暂时到此,休息时间到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值