eXile 的专栏

Reactor模式中网络事件分派探讨


原文地址: http://www.cppblog.com/eXile

   对于使用线程池的Reactor模式,针对每一个SOCKET句柄的事件处理器handler可能被分派到不同的线程当中,这就要求handler的每一个操作都是线程安全的。
  可以使用一种办法使一个handler的操作只能分派到一个线程中:为每一个handler设定一个线程所有者ID,一开始ID为空,则每个线程都可以分派,第一次分派之后,则设定为该线程ID,以后只分派到该线程中。这样,可以保证handler操作的单线程性,简化以后handler的具体实现。这个ID也可以灵活设置,以适应具体事务的要求。
  但这样并不能保证handler彻底无锁,因为还会有两个线程会出现竟争,除了这个事件处理线程以外,还有事件分派线程(即事件侦听线程)。对于这个问题的解决办法如下:为每个handler设定一个原子计数,事件分派线程在分派事件前,首先设定该原子计数,若设置失败,表明此时正有其它线程在处理该handler,则并不分派该事件,而是将它置于一个pending队列中,等待以后分派。
   还有一种简单的方法,就是将该handler直接挂起,处理完后才允许进行事件分派。

posted on 2008-05-22 15:27 eXile 阅读(2653) 评论(7)  编辑 收藏 引用 所属分类: 网络开发

评论

# re: Reactor模式中网络事件分派探讨 2008-05-22 20:51 true

想必你看过ace,有个TP_Reactor  回复  更多评论   

# re: Reactor模式中网络事件分派探讨 2008-05-22 22:21 eXile

ACE的TP_Reactor 是基于‘领导者/跟随者’模式,这里的探讨主要是针对半同步半异步模式。不过要实现一个无锁的handler,‘领导者/跟随者’模式应该更容易一些。   回复  更多评论   

# re: Reactor模式中网络事件分派探讨 2008-05-22 22:47 eXile

对ACE的TP_Reactor没有过深研究,boost::asio中的reactor也是‘领导者/跟随者’模式,不过asio并不保证这一点,还得自己加锁  回复  更多评论   

# re: Reactor模式中网络事件分派探讨 2008-05-23 10:06 bugs_killer

我觉得根本就不会出现分配到多线程的问题..
假如1. socket_1 接收到消息..那么我们把它分配到线程1. 同时我们也要将此句柄从select中移除.. 不然地话.它会马上又触发可读事件. 如果照这种逻辑一个句柄是有可能同时分配到多个线程.但这种逻辑是错误的..

我想应该是这样的.. ACE的作者有一篇文件讲领导者/跟随者 模式的..里边有提到.

文档的名字叫 lf.pdf  回复  更多评论   

# re: Reactor模式中网络事件分派探讨 2008-05-23 12:07 eXile

谢谢修正,没有看过,不过对于简单的LF模型确实是这样的,因为它可以使用阻塞IO或者单独select,处理起来比较简单。  回复  更多评论   

# re: Reactor模式中网络事件分派探讨 2008-05-23 12:39 eXile

对于半同步半异步模式也可以在线程间传递socket描述符来简化处理,但这样业务逻辑就不容易和底层IO脱离, 处理起来要麻烦一些, 我想的也不成熟,欢迎探讨。
BTW,已经找到了 lf.pdf 和 hs-ha.pdf , 看来要研读一下....  回复  更多评论   

# re: Reactor模式中网络事件分派探讨 2008-05-23 19:12 bugs_killer

多多交流啊...

msn: shaovie@hotmail.com
QQ : 43458943  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿(18)

随笔分类

随笔档案

服务器编程

搜索

最新评论

阅读排行榜

评论排行榜