C++ I/O完成端口与QueueUserApc?
在Windows下,有两种方法可以插入工作项以避免创建过多线程: 方法1:使用IOCP 方法2:使用QueueUserApc 然而,方法1远比方法2复杂C++ I/O完成端口与QueueUserApc?,c++,c,windows,performance,threadpool,C++,C,Windows,Performance,Threadpool,在Windows下,有两种方法可以插入工作项以避免创建过多线程: 方法1:使用IOCP 方法2:使用QueueUserApc 然而,方法1远比方法2复杂 所以我的问题是:与方法2相比,方法1有哪些优点?当您调用QueueUserApc时,您必须针对特定的线程 IOCP有一个内置的线程调度机制,QueueUserApc缺少该机制,它允许您将线程池中最高效的线程作为目标。线程调度机制会自动防止太多线程同时运行(这会导致额外的上下文切换和额外的争用)或太少线程同时运行(这会导致性能低下) Window
所以我的问题是:与方法2相比,方法1有哪些优点?当您调用
QueueUserApc
时,您必须针对特定的线程
IOCP有一个内置的线程调度机制,QueueUserApc
缺少该机制,它允许您将线程池中最高效的线程作为目标。线程调度机制会自动防止太多线程同时运行(这会导致额外的上下文切换和额外的争用)或太少线程同时运行(这会导致性能低下)
Windows实际上跟踪运行IOCP作业的线程数。它最初将允许运行的线程数设置为与计算机上的虚拟内核数相等。但是,如果一个线程阻塞I/O或同步,IOCP端口上阻塞的另一个线程将自动释放,从而避免线程饥饿
此外,IOCP可以轻松地连接到I/O,以便I/O事件触发IOCP端口上阻塞的线程的调度。这是在Windows上对大量目标进行I/O的最有效方法。+1。回答得好。注意:第二段直接说明了为什么允许“运行”线程的数量和“可运行”线程池的实际大小可能会明显不同。操作系统通过等待条件检测为您执行内部调度的能力近乎惊人,这一点怎么强调都不过分。@WhozCraig:我同意。我很惊讶其他操作系统没有采用类似的调度机制。虽然其他操作系统具有出色的I/O发现机制(如Linux和FreeBSD),但我不知道还有其他操作系统具有类似的分派机制,更不用说直接绑定到I/O发现/通知机制。