加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Proactor和Reactor模式_继续并发系统设计的扫盲

发布时间:2020-12-15 05:27:04 所属栏目:百科 来源:网络整理
导读:Proactor和Reactor模式_继续并发系统设计的扫盲 6.6.2008 Kevin Lynx Proactor和Reactor都是并发编程中的设计模式。在我看来,他们都是用于派发/分离IO操作事件的。这里所谓的 IO事件也就是诸如read/write的IO操作。"派发/分离"就是将单独的IO事件通知到上层

Proactor和Reactor模式_继续并发系统设计的扫盲

6.6.2008

Kevin Lynx

Proactor和Reactor都是并发编程中的设计模式。在我看来,他们都是用于派发/分离IO操作事件的。这里所谓的
IO事件也就是诸如read/write的IO操作。"派发/分离"就是将单独的IO事件通知到上层模块。两个模式不同的地方
在于,Proactor用于异步IO,而Reactor用于同步IO。

摘抄一些关键的东西:

"
Two>///
classhandler
{
public:
virtualvoidonRead()=0;
virtualvoidonWrite()=0;
virtualvoidonAccept()=0;
}
;

classdispatch
{
public:
voidpoll()
{
//addfdintheset.
//
//polleveryfd
intc=select(0,&read_fd,&write_fd,0);
if(c>0)
{
foreachfdintheread_fd_set
{iffdcanread
_handler->onRead();
iffdcanaccept
_handler->onAccept();
}


foreachfdinthewrite_fd_set
{
iffdcanwrite
_handler->onWrite();
}

}

}


voidsetHandler(handler*_h)
{
_handler=_h;
}


private:
handler*_handler;
}
;

///application
classMyHandler:publichandler
{
public:
voidonRead()
{
}


voidonWrite()
{
}


voidonAccept()
{
}

}
;


在网上找了份Proactor模式比较正式的文档,其给出了一个总体的UML类图,比较全面:

根据这份图我随便写了个例子代码:

classAsyIOProcessor
{
public:
voiddo_read()
{
//sendreadoperationtoOS
//readiofinished.anddispatchnotification
_proactor->dispatch_read();
}


private:
Proactor*_proactor;
}
;

classProactor
{
public:
voiddispatch_read()
{
_handlerMgr->onRead();
}


private:
HandlerManager*_handlerMgr;
}
;

classHandlerManager
{
public:
typedefstd::list<Handler*>HandlerList;

public:
voidonRead()
{
//notifyallthehandlers.
std::for_each(_handlers.begin(),_handlers.end(),onRead);
}


private:
HandlerList*_handlers;
}
;

classHandler
{
public:
virtualvoidonRead()=0;
}
;

// applicationlevelhandler.
classMyHandler: publicHandler
{
public:
voidonRead()
{
//
}

}
;


Reactor通过某种变形,可以将其改装为Proactor,在某些不支持异步IO的系统上,也可以隐藏底层的实现,利于编写跨平台
代码。我们只需要在dispatch(也就是demultiplexor)中封装同步IO操作的代码,在上层,用户提交自己的缓冲区到这一层,
这一层检查到设备可操作时,不像原来立即回调handler,而是开始IO操作,然后将操作结果放到用户缓冲区(读),然后再
回调handler。这样,对于上层handler而言,就像是proactor一样。详细技法参见这篇文章。

其实就设计模式而言,我个人觉得某个模式其实是没有完全固定的结构的。不能说某个模式里就肯定会有某个类,类之间的
关系就肯定是这样。在实际写程序过程中也很少去特别地实现某个模式,只能说模式会给你更多更好的架构方案。

最近在看spserver的代码,看到别人提各种并发系统中的模式,有点眼红,于是才来扫扫盲。知道什么是leader>

posted on 2008-06-06 13:25Kevin Lynx阅读(20572)评论(7)编辑收藏引用所属分类:network、模块架构

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读