6
另外在开发的时候我们比较关心的一个问题就是多个线程获取到关闭IO的事件应该如何处理,从一份代码中,看到如下的一段代码,共享出来,希望可以对大家有所帮助:



这里没有使用计数,同时在多个CPU存在的时候,并不会影响多次释放的问题,大家一看便知。
Tags: | 引用(0)
楠楠
2008/08/17 01:36
这种方式,不是特别好。 最好Post一个消息, 在GET之后,再进行释放。 我现在就是这样做的。
      我反而觉得IOCP难处理的地方在于锁的设计,一不小心,就会死锁。
huzhangyou2002 Email Homepage
2008/06/04 16:10
to 刀客:我看到过有代码是这么处理的 从优雅的角度来说的确不是很漂亮 但是对于如果是退出server 并没有什么不妥的 而在运行中的 客户端退出的方式 上面展示的代码还是很可取的
liupeng2002 Email
2008/06/04 15:24
m_listContexts.Find(pContext)) 这个查找还有必要吗?
我觉得直接使用if(pContext->m_Socket != INVALID_SOCKET)即可达到效果.
huzhangyou2002 回复于 2008/06/04 16:15
从理解看 这样是可以的 并没有实际测试时候可行 如果这样真实可行的话 可以提高很多性能
关中刀客 Homepage
2008/06/04 11:27
我的这个思想是我在实现我的cobra底层库的时候发现的。
维护很多的套接字,每个套接字可能有很多的WSASend投递中,但是每个只有一个WSARecv投递,当我退出程序的时候,关闭所有的链接,这个时候,这些投递会失败返回事件,然后我再这些事件里面回收资源,然后再发送n个相应的io处理线程退出消息包给iocp,这样子他们的线程就可以全部的推出了,但是但是,我不能十分的确定,什么时候我全部投递的事件,不管是recv还是send的都因为相应的套接字关闭而回收了自己的资源。我现在的做法是关闭完所有的链接之后,sleep(10),这期间假设所有投递的事件都失败,相应的资源都回收了,等sleep过后,我才发送完成端口线程退出的消息给iocp
呵呵,总感觉不适很完美的办法
huzhangyou2002 Email Homepage
2008/06/04 10:02
不知道
CancelIo 这个地方 以及
while (!HasOverlappedIoCompleted((LPOVERLAPPED)pContext))    
                Sleep(0);
是否可以达到等待取消所有该Socket上面的IO操作了 我想好像应该可以做到的

CLock  锁的操作以及 MoveToFreePool 这个线程池机制是本段代码的核心
分页: 1/2 第一页 1 2 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]