当多个线程等待同一个IOCP时,GetQueuedCompletionStatusEx是否会进行负载均衡?

问题描述 投票:0回答:1

假设 4 核 CPU 计算机上的 4 个线程使用常规 GetQueuedCompletionStatus 函数等待同一 IOCP。当 4 个 I/O 操作同时完成时,4 个线程中的每一个都会获得 1 个完成数据包,然后所有 4 个线程都可以同时处理其数据包。

使用 GetQueuedCompletionStatusEx(可以同时检索多个完成)时是否仍然适用?如果使用 Ex 版本有 4 个线程等待数据包怎么办?每个线程是否会像使用常规 API 一样仅获得 1 个完成数据包?或者一个线程会获得所有 4 个完成数据包吗?

我想知道,因为如果它执行后者,那么它几乎违背了在多个线程上并行处理完成数据包的想法。

windows multithreading iocp
1个回答
0
投票

如果使用Ex版本有4个线程等待数据包怎么办?将每个 线程只获得 1 个完成数据包,就像使用常规线程一样 API?或者一个线程会获得所有 4 个完成数据包吗?

没有 API 可以一次插入多个数据包。总是只插入 1 个数据包。因此,无论使用哪个 api 以及使用哪个参数,总会有一些线程只获取 1 个数据包。

从另一边来看,如果队列中已经有几个(m)数据包,并且调用了 Ex 版本,则要删除最多 n 个数据包 - 该线程将删除

min(m,n)
数据包。多个线程同时开始等待也是不可能的。始终只有 1 个线程访问端口。如果此时队列中存在多个数据包 - 线程可以删除多个数据包,或者如果没有数据包则开始等待(或者队列上已经有太多线程处于活动状态)

所以事实上这个问题根本没有什么意义。

© www.soinside.com 2019 - 2024. All rights reserved.