Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ I/O完成端口与QueueUserApc?_C++_C_Windows_Performance_Threadpool - Fatal编程技术网

C++ I/O完成端口与QueueUserApc?

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

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

方法1:使用IOCP

方法2:使用QueueUserApc

然而,方法1远比方法2复杂


所以我的问题是:与方法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发现/通知机制。