6
to 刀客:我看到过有代码是这么处理的 从优雅的角度来说的确不是很漂亮 但是对于如果是退出server 并没有什么不妥的 而在运行中的 客户端退出的方式 上面展示的代码还是很可取的
m_listContexts.Find(pContext)) 这个查找还有必要吗?
我觉得直接使用if(pContext->m_Socket != INVALID_SOCKET)即可达到效果.
我觉得直接使用if(pContext->m_Socket != INVALID_SOCKET)即可达到效果.
huzhangyou2002 回复于 2008/06/04 16:15
从理解看 这样是可以的 并没有实际测试时候可行 如果这样真实可行的话 可以提高很多性能
我的这个思想是我在实现我的cobra底层库的时候发现的。
维护很多的套接字,每个套接字可能有很多的WSASend投递中,但是每个只有一个WSARecv投递,当我退出程序的时候,关闭所有的链接,这个时候,这些投递会失败返回事件,然后我再这些事件里面回收资源,然后再发送n个相应的io处理线程退出消息包给iocp,这样子他们的线程就可以全部的推出了,但是但是,我不能十分的确定,什么时候我全部投递的事件,不管是recv还是send的都因为相应的套接字关闭而回收了自己的资源。我现在的做法是关闭完所有的链接之后,sleep(10),这期间假设所有投递的事件都失败,相应的资源都回收了,等sleep过后,我才发送完成端口线程退出的消息给iocp
呵呵,总感觉不适很完美的办法
维护很多的套接字,每个套接字可能有很多的WSASend投递中,但是每个只有一个WSARecv投递,当我退出程序的时候,关闭所有的链接,这个时候,这些投递会失败返回事件,然后我再这些事件里面回收资源,然后再发送n个相应的io处理线程退出消息包给iocp,这样子他们的线程就可以全部的推出了,但是但是,我不能十分的确定,什么时候我全部投递的事件,不管是recv还是send的都因为相应的套接字关闭而回收了自己的资源。我现在的做法是关闭完所有的链接之后,sleep(10),这期间假设所有投递的事件都失败,相应的资源都回收了,等sleep过后,我才发送完成端口线程退出的消息给iocp
呵呵,总感觉不适很完美的办法
不知道
CancelIo 这个地方 以及
while (!HasOverlappedIoCompleted((LPOVERLAPPED)pContext))
Sleep(0);
是否可以达到等待取消所有该Socket上面的IO操作了 我想好像应该可以做到的
CLock 锁的操作以及 MoveToFreePool 这个线程池机制是本段代码的核心
CancelIo 这个地方 以及
while (!HasOverlappedIoCompleted((LPOVERLAPPED)pContext))
Sleep(0);
是否可以达到等待取消所有该Socket上面的IO操作了 我想好像应该可以做到的
CLock 锁的操作以及 MoveToFreePool 这个线程池机制是本段代码的核心
分页: 1/2
1 2
1 2
IOCP中如何充分利用GQCS以及系统中的这个线程池
Delphi - 被廉价甩卖的传奇 [zz]


2008/06/03
09:14
3992





