ace_select_reactor_t线程模型
2017-03-28 17:02:21 0 举报
ACE线程管理
作者其他创作
大纲/内容
GotToken
releaseLock
ReleaseToken
普通线程1
resume(IO)
dispatch
register_handler
getEvent(once)
普通线程2
ActiveEvent
select(I/O、Msg、Signal)
gotLock
suspend(IO)
TryGetToken
Notify(Msg)
其他线程1
普通线程0
waitForMultipleObjects
DispatchEvent
Proactor的模型允许以下两个阶段来执行IO模型而无须等待它们完成:(1)不须等待它们完成,应用就可以在多个IO句柄上并行地发起一个或多个异步IO操作(2)在每个操作完成时,OS会通知应用定义的完成处理器,由它随后对已完成的IO操作的结果进行处理。而reactor的模型,这两个阶段是刚好相反的:(1)使用一个事件多路分离器来确定某个IO操作何时可以进行,并且有可能即使完成(2)同步地执行操作。 ACE_Proactor框架对以下操作负责: - 发起异步IO操作 - 保存每个操作的参数,并将它们中继到完成处理器。 - 等待表明这些操作完成的完成事件 - 将完成事件多路分离给其相关的完成处理器 - 分派处理器的挂钩方法,通过应用定义的方式来处理事件。相关类:ACE_Handle:定义于接受异步IO操作的结果和处理定时器到期的借口。ACE_Async_Read/Write_Stream、ACE_Async_Result:在IO流上发起异步读写操作,将其与用于接收这些行为的结果的ACE_Handler对象相关联。ACE_Aynch_Acceptor/Connector:Acceptor-Connector模式,建立新的TCP/IP异步连接。ACE_Service_handler:定义Acceptor和Connector连接工厂的目标,并提供挂钩方法来初始化一个通过TCP/IP连接的服务。ACE_Procator:管理定时器和异步IO完成事件多路分离。类似于ACE_Reactor.ACE_Proactor也和ACE_Reactor一样是白盒框架,不过其网络应用事件处理器必须派生自ACE_Handle,例如ACE_Service_Handler,对应的ACE_Reactor的事件处理器则必须是ACE_Event_Handler。前摄式与反应式IO的主要区别:前摄式IO的发起和完成时分别发生的两个不同步骤。ACE_Messag_Block反人类设计:使用写指针用于读和将读指针用于写。这样思考:在读数据时,他从消息块中被写入。同样的,在写数据时,它被用来读取消息块。因此在读完之后,ACE_Message_Block更新后的数据长度会变大(因为写指针已前移),在写完成(因为读指针已前移)时会变小。前摄式的Acceptor和Connector的类前面都有Asynch和反应式的作区分。Acceptor的open方法,初始化进行侦听tcp socket,并发起一个或多个异步accept操作。从实际来看,最重要的是:将IO句柄,ACE_Handler对象以及ACE_Proactor绑定起来。至于那些辅助类中对于回调的接口设置,大都是对于应用的合理抽象,比如ACE_Service_Handler的open方法就是用于新连接建立后的初始化之用的回调函数。
Notify
ChangeReactor(handler/Timer/Signal)
Reactor线程
0 条评论
下一页