一套网络框架的杯具

之前设计了一套网络框架,持续改进了很多年,使用在很多项目上,综合效率还行,也很稳定,一直以来对这套东西信心满满,总以为啥问题都好解决,但最近就有个需求让我选择还是改了下这个框架。

之前的框架是这样的,可以开一组Nio线程,可以开一组N个同步线程(默认1个),可以开一组N个异步线程(默认1个),可以开一组Ntimer线程(默认1个),可以开一组N个异步线程(默认cpu个),每组可独立受控,每组可支持自定义消息,可支持timer,一组N个如果N大于1则无法直接给这组里面的特定线程发消息,只能给一组发消息,这个组里面会选择某个合适的线程处理这个消息,这也是iocp高效和典型的用法了,但这也正是问题的结症所在。

Linux下的多线程服务器更常见的做法跟这个不大相似,一般都是将某些socket分配到某些线程epoll,分好之后就是固定的,不再变化,跟Iocpsocket绑定到一组线程的做法不同,由于某个socket直接绑定到了某个线程,所以有些问题就变得简单了,如同一个连接的在同一个线程内消息进行了同步,要跟io线程绑定私有化数据也简单了,而且每个线程可独立受控,所以很容易实现一组io各自挂tls(线程局部存储)数据,而我现在做的这套框架就是这方面不好控了,其实也很难说这两种意义上的框架到底谁更优,如用在web型应用上这种socket被一组io线程管理的模式很方便效率也高,但我现在的需求需要某个socket使用线程相关数据,以避免数据之间的锁,我用内存换时间,由于在原来的框架上增逻辑难以实现可直接控制io线程的框架的,所以花了一个晚上重新改写了一套框架,在原来iocpframe的基础上派生了一组带2名称的类,除替换类名之外只修改了几十行代码就做好了,总的来说花的时间还是比较少的。修改后io线程一组,但独立受控,外部可对这组线程中的某一个直接发消息,基本满足了需求,现在要给每个io线程绑定私有数据并触发特定消息比之前简单多了,而且绝对无锁。

 

Posted on 2011-01-26 16:14 袁斌 阅读(2750) 评论(1)  编辑 收藏 引用 所属分类: c++网络

Feedback

# re: 一套网络框架的杯具  回复  更多评论   

2011-01-27 18:16 by Soli
杯具何在?

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