【问题标题】:I/O Completion Port vs. QueueUserApc?I/O 完成端口与 QueueUserApc?
【发布时间】:2013-01-04 22:18:42
【问题描述】:

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

手段1:使用IOCP;

手段2:使用QueueUserApc。

但是,手段 1 远比手段 2 复杂。

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

【问题讨论】:

    标签: c++ c windows performance threadpool


    【解决方案1】:

    当您调用QueueUserApc 时,您必须针对特定线程。

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

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

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

    【讨论】:

    • +1。不错的答案。注意:第二段直接导致您允许“运行”线程的数量和“可运行”线程池的实际大小可能明显不同的原因。操作系统通过等待条件检测为您执行此内部调度的能力几乎是惊人的,不能夸大其词。
    • @WhozCraig:我同意。我很惊讶其他操作系统没有采用类似的调度机制。虽然其他操作系统具有出色的 I/O 发现机制(如 Linux 的 epoll 和 FreeBSD 的 kqueue),但我不知道有任何其他操作系统具有类似的调度机制,更不用说直接绑定到 I/O 的操作系统了发现/通知机制。
    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    相关资源
    最近更新 更多