4
在通过LPOVERLAPPED 结构了解的IOCP原理之后,其实我们可以通过很多方法来充分利用这个IOCP的线程池,而避免过多的线程的开销。

方法如下:

我们可以对IOCP的封装中封装更多的事件,比如:



而当我们比如接收完数据之后,将数据压入某个定义好的buffer队列中,我们有两种方法可以处理这个数据:

1:使用一个专门的线程处理该数据
2:Post一个消息给IOCP使得GQCS返回,然后由这个线程事件去触发执行

第一种方法的伪代码大致如下:


IN GQCS

GetDataBuffer

InsertIntoList

SetEvent



In Thread
     WaitForEvent
     ParseBufferList
     FurtherExecute(Send or Send All)
     ClearEvent


第二种方法就是本文真正想阐述的:

改变的地方在哪里呢:


In GQCS
GetDataBuffer
InsertIntoList
PostQueuedCompletionStatus


部分代码:


通过上面的代码之后,GQCS将得到一个完成事件,然后在该事件里面判断是否是IOParse,如果是,进入相应的处理函数:




这样我们就可以充分理由这个系统为我们维护的线程池了!而并不需要我们额外的开辟线程或者线程池来运行程序,越来越体会到这个IOCP的设计理念很强。

Tags: , | 引用(0)
huzhangyou2002 Email Homepage
2008/06/04 15:57
:-),这么说是准确的 的确是如此

当然必须用到另外线程的地方还是不能少
只是这是充分利用系统为我们维护的线程池的一个好方法
谢谢刀客分享
关中刀客 Homepage
2008/06/04 11:19
你没有理解我的意思,我的意思是说,你也需要各地方来处理发送你的post吧,比如,你想隔10秒八所有的日志写入文件中,所以你需要在某个地方来处理,每隔10秒post一个记录日志的消息给iocp,在比如说,你每隔30秒轮训以下当前所有的链接,看有没有死链接,你的需要在某个地方处理,每隔30秒发送一个检查状态的消息包给iocp吧。
我说的就是这些东西,把这些都加入到一个自己实现的应用层的定时器中,相应的时间一到,定时器会执行你注册的函数,post某个类型的消息给iocp
huzhangyou2002 Email Homepage
2008/06/04 09:59
谢谢刀客光顾 嘿嘿

使用定时器我觉得效果不会很好 不知道定时器是不是使用中断的方式唤醒 如果是的话 我觉得性能耗损不划算 使用这种post机制是一种很完美的 当然具体的数据测试我没有考虑过
或许拿出数据会更有说服力一些
关中刀客 Homepage
2008/06/04 09:40
这个方法不错,但是实际中需要我们配合定时器机制来实现的,所以很多情况下,还是单开线程作固定的事情,比如日志线程就只管写日志,检测线程就只管检测
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]