在 Windows 下,为了避免创建过多线程,有两种方法可以插入工作项:
手段1:使用IOCP;
方法2:使用QueueUserApc。
然而,手段 1 比手段 2 复杂得多。
所以我的问题是:相对于手段 2,手段 1 的优势是什么?
在 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 的最有效方式。