IOCP是否创建自己的线程

Does IOCP creates its own threads?

本文关键字:线程 自己的 创建 是否 IOCP      更新时间:2023-10-16

我正在学习IOCP,根据这篇文章:

要开始使用完成端口,我们需要创建一个完成端口这反过来又创建了多个并发线程(与完工港一起存在-不要与Worker混淆线程)。

我认为唯一存在的线程是我创建的用于从完成端口将完成数据包出列的线程。完成端口创建的"并发线程"是什么?

作者似乎并不完全理解完成端口。除了你引用的语句外,这篇文章中还有一个图表,其中再次包含短语"并发线程"。没有这样的事情。完成端口的线程数设置是允许同时执行的线程数。

那篇文章里还有其他奇怪的东西。他正在创建一个套接字,只用于调用CreateIoCompletionPort。在他破坏插座之后。作者似乎相信他在网上其他地方看到的一些咒语。不要把这篇文章看得太字面。阅读API文档。

IOCP不会创建自己的线程。IOCP操作在后台组中运行,然后将其结果发布到IOCP完成队列。CreateIoCompletionPort()NumberOfConcurrentThreads参数仅控制允许多少工作线程同时处理完成数据包。MSDN文档对此进行了解释。

I/O完成端口

尽管任意数量的线程都可以为指定的I/O完成端口调用GetQueuedCompletionStatus,但当指定的线程第一次调用GetQueQueuedCCompletionStatus时,它会与指定的I/O结束端口关联,直到发生以下三种情况之一:线程退出、指定其他I/O结束端口或关闭I/O结束端口。换句话说,一个线程最多可以与一个I/O完成端口关联。

当完成数据包排队到I/O完成端口时,系统首先检查有多少与该端口相关联的线程正在运行。如果运行的线程数小于并发值(在下一节中讨论),则允许其中一个等待线程(最近的线程)处理完成数据包。当正在运行的线程完成处理时,它通常会再次调用GetQueuedCompleteStatus,此时它要么返回下一个完成数据包,要么在队列为空时等待。

需要仔细考虑的I/O完成端口最重要的属性是并发值。当使用CreateIoCompletionPort通过NumberOfConcurrentThreads参数创建完成端口时,会指定该端口的并发值。此值限制与完成端口关联的可运行线程的数量。当与完成端口相关的可运行的线程总数达到并发值时,系统将阻止与该完成端口相关联的任何后续线程的执行,直到可运行线程数量降至并发值以下。