2013-01-21 38 views
5

在Windows下,有两种方法插入工作项以避免创建太多线程:I/O完成端口与QueueUserApc?

方法1:使用IOCP;

手段2:使用QueueUserApc。

然而,意味着1远远比复杂的装置2

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

回答

7

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

IOCP有一个内置的线程调度机制,QueueUserApc缺少允许您将线程池中最高效的线程作为目标。线程调度机制可以自动防止同时运行太多的线程(这会导致额外的上下文切换和额外的争用),或者同时运行的线程太少(这会导致性能下降)。

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

此外,IOCP可以很容易地连接到I/O,以便I/O事件触发在IOCP端口上阻塞的线程派发。这是对Windows上的大量目标进行I/O操作的最有效方式。

+0

+1。好的答案。注意:第二段直接导致你是允许的“正在运行”线程的数量的原因,并且“可运行”线程池的实际大小可能明显不同。操作系统通过等待状态检测为你做内部调度的能力非常惊人,并且不能被夸大。 – WhozCraig

+0

@WhozCraig:我同意。我很惊讶其他操作系统没有采用类似的调度机制。虽然其他操作系统具有出色的I/O发现机制(如Linux的[epoll](http://en.wikipedia.org/wiki/Epoll)和FreeBSD的[kqueue](http://en.wikipedia.org/wiki/) Kqueue)),我不知道有任何其他操作系统具有可比较的调度机制,更不用说直接绑定到I/O发现/通知机制的操作系统。 –