IOCP投递多个WSARecv存在的问题

看完 A simple IOCP Server/Client Class 发现 IOCP投递多个WSARecv存在3个问题:

1. 多个pending recv,多个worker,数据包会乱序。

解决方法:可以通过给数据包加序号解决。但是不确定性能能提高多少,codeproject的作者对多worker的处理是只有一个pending recv


2. 多个pending recv,多个worker,会有脏读的情况。

个人理解:比如投递4个pending recv。每个recv buffer为8K。第一个线程recv bufferr接收2K后由于CPU线程调度,跳到第二个线程,第二个线程的recv buffer接收满8K。然后线程调度跳回第一个线程,第一个线程接收6K。但是这样也乱序了,因为第一个线程收到的后6K其实是整个包中的第11k~16k。
解决方法:在IOCPS类的ProcessPackage方法中


3. 多个pending recv,多个worker,当并发连接数很大的时候,会出现错误:WSAENOBUGS
原因:投递出去的recv buffer会被操作系统锁定,当并发数太大,则内存不够用了。
解决方法:投递一个0字节的WSARecv,这样用户缓冲区内存不会被锁定,数据会直接存在内核缓冲区。
这种方法提高了并发能力,却降低了吞吐量。


IOCP还有一个非法访问内存问题:
当client关闭后,如果还有pending io的话,pending io会非法访问已经delete 的client context
解决方法:给每个client context加一个变量m_nNumberOfPendlingIO,表示pending io数量,当为0时才删除
这里有疑问:CancelIo的时候不会会取消pending IO吗,为什么还要加这个变量?

根据以上的问题,我觉得用多个pending io的难度还是蛮大的,连codeproject的作者在多worker的时候也放弃了多个pending io。
我不理解为什么要舍弃多线程(多worker)。

以上问题如果有人明白,希望能评论区不吝赐教,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值