关于IOCP的一个小问题

[复制链接]
查看11 | 回复4 | 2021-1-27 06:52:09 | 显示全部楼层 |阅读模式
我用4个线程同时去Get完成端口,但是如果当一个客户端断开的时候,由于这4个线程都堵在Get处,有时候这4个线程都同时接受到客户端断开,这样,我断开释放buf的地方就调用多次。。有木有。。
如果4个线程都堵在Get处,那么有很大几率都能Get到断开信息,数字也不确定,有时候是3个线程Get到断开信息。
这种情况怎么处理啊。
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:52:09 | 显示全部楼层
这事不会发生。一个IO完成通知只会其中一个线程处理。
回复

使用道具 举报

千问 | 2021-1-27 06:52:09 | 显示全部楼层
但是我这个的确是发生了。。开始4个线程全都堵在了GetQueuedCompletionStatus,然后一个客户端断了,4个线程都Get到了同样的断开信息。

引用1楼mujiok2003的回复:这事不会发生。一个IO完成通知只会其中一个线程处理。
回复

使用道具 举报

千问 | 2021-1-27 06:52:09 | 显示全部楼层
除了断开是这样的,其他都正常。
回复

使用道具 举报

千问 | 2021-1-27 06:52:09 | 显示全部楼层
引用2楼sjjwind的回复:但是我这个的确是发生了。。开始4个线程全都堵在了GetQueuedCompletionStatus,然后一个客户端断了,4个线程都Get到了同样的断开信息。

Quote: 引用1楼mujiok2003的回复:
这事不会发生。一个IO完成通知只会其中一个线程处理。

代码肯定有问题。看看IOCP的基本原理。
WhenacompletionpacketisqueuedtoanI/Ocompletionport,thesystemfirstcheckshowmanythreadsassociatedwiththatportarerunning.Ifthenumberofthreadsrunningislessthantheconcurrencyvalue(discussedinthenextsection),oneofthewaitingthreads(themostrecentone)isallowedtoprocessthecompletionpacket.Whenarunningthreadcompletesitsprocessing,ittypicallycallsGetQueuedCompletionStatusagain,atwhichpointiteitherreturnswiththenextcompletionpacketorwaitsifthequeueisempty.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行