ACE_POSIX_AIOCB_Proactor和ACE_WIN32_Proactor的区别

在调用流程上这两种Proactor的具体实现并无太大差异。
基本上的流程是这样的:
0.在handler的open接口中调用异步读写的例如ACE_Asynch_Read_Stream和ACE_Asynch_Write_Stream的open接口,用于绑定handler和异步完成事件。
1.调用proactor_run_event_loop来持续调用handle_events持续等待完成事件发生,然后分派其想关联的完成处理器。
2.外部主动调用read或者write的异步接口,例如
ACE_Asynch_Read_Stream和ACE_Asynch_Write_Stream的read和write接口,该接口会立刻返回,但是若完成了读写就会让handle_events收到。
3.收到通知的handle_events会让其绑定的handler去处理完成事件,例如handle_read_stream和handle_write_stream。
4.若需要持续读写,则持续在完成事件中,去调用新的异步的读写接口,提交新的异步操作请求。

那么在上述过程中ACE_POSIX_AIOCB_Proactor和ACE_WIN32_Proactor的区别在哪里?
0.这步中的,ACE_Asynch_Read_Stream的 open函数
先调用proactor的create_asynch_read_stream接口去获取一个ACE_Asynch_Read_Stream的对应proactor的实际具体实现。然后对比:
(1)Posix中,会调用ACE_POSIX_Asynch_Read_Operation的open函数,在获取到posix的proactor之后,调用将handler的handle和ACE_POSIX_Asynch_Read_Operation的绑定。(ACE_POSIX_Proactor的register_handle是空实现)
(2)Win32中,会调用ACE_WIN32_Asynch_Read_Operation的open函数,在获取到win32的proactor之后,调用其中的register_handle,其实际是调用了::CreateIOCompletionPort接口

1.这步中的,proactor_run_event_loop的handle_evens:
(1)在Posix中是signalwaitinfo()函数
(2)在win32中是::GetQueuedCompletionStatus函数去获取完成事件

2.这步中,所谓ACE_Asynch_Read_Stream的read接口实际是:(1)ACE_POSIX_Asynch_Read_Stream的read实现,是new一个ACE_POSIX_Asynch_Read_Stream_Result,这个result实际就是aiocb类型,然后调用proactor的start_aio。最终当aio完成时,会发signal,打断handle_events的signalwait函数获取到完成事件。
(2)ACE_WIN32_Asynch_Read_Stream的read实现,是是new一个ACE_WIN32_Asynch_Read_Stream_Result,这个result实际就是aiocb类型,然后调用shared_read,这个接口去调用::ReadFile,这是个异步请求。在完成时会触发post_completion,让win32的handle_events打断能够获取queue中的完成事件。

3.这步中的,proactor_run_event_loop的handle_evens:
(1)在Posix中是signalwaitinfo()函数收到信号,然后按照预定好的信号值作为索引去获取之前存入result_list的result进行分配handle对应的handler的,result会有相关的回调。
(2)在win32中是::GetQueuedCompletionStatus函数去获取完成事件,然后从队列中取出ACE_WIN32_Asynch_Result类型的结果。

4.这步操作上应该都是一样的了。

需要注意的是:
ACE_POSIX_Asynch_Accept和ACE_POSIX_Asynch_Connect几乎所有的操作都是用ACE_Aynch_Pseudo_Task来完成的,而这个类是类似一个独立的线程去按照select_reactor去完成异步操作后返回。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值