c++ - I/O 完成端口与 QueueUserApc?

标签 c++ c windows performance threadpool

在Windows下,为了避免创建过多的线程,有两种插入工作项的方法:

方式一:使用IOCP;

方式二:使用QueueUserApc。

但是,手段 1 比手段 2 复杂得多。

所以我的问题是:相对于方法 2,方法 1 的优势是什么?

最佳答案

当您调用 QueueUserApc 时,您必须以特定线程为目标。

IOCP 具有 QueueUserApc 所缺乏的内置线程调度机制,可让您从线程池中选择最高效的线程。线程调度机制自动防止太多线程同时运行(这会导致额外的上下文切换和额外争用)或同时运行太少线程(这导致性能不佳)。

Windows 实际上会跟踪运行 IOCP 作业的线程数。它最初将允许运行的线程数设置为等于机器上的虚拟内核数。但是,如果一个线程因 I/O 或同步而阻塞,则阻塞在 IOCP 端口上的另一个线程会自动释放,从而避免线程饥饿。

此外,IOCP 可以轻松连接到 I/O,以便 I/O 事件触发调度阻塞在 IOCP 端口上的线程。这是对 Windows 上的大量目标执行 I/O 的最有效方式。

关于c++ - I/O 完成端口与 QueueUserApc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14445787/

相关文章:

windows - 批处理中的文件名、目录名或卷标语法不正确

java - 如何屏蔽HSQL密码

c++ - 为什么使用预处理器 #if 语句而不是 if() else?

python - 运行带参数的 python 脚本

c - 为什么这个反向函数不能正常工作?

c - 不同类型 ('struct TGAME' 与 'struct TGAME' 的 Typedef 重定义)

Windows PowerShell 导入模块

c++ - AActor在ue4中设置移动性

c++ - 了解 std::copy

c++ - 递归 typedef 函数定义:std::function 返回自己的类型