IOCP 是不是创建自己的线程?
Posted
技术标签:
【中文标题】IOCP 是不是创建自己的线程?【英文标题】:Does IOCP creates its own threads?IOCP 是否创建自己的线程? 【发布时间】:2015-02-21 17:27:42 【问题描述】:我正在学习IOCP,据此article:
要开始使用完成端口,我们需要创建一个完成端口 这反过来又创建了许多并发线程(线程 与完成端口一起存在 - 不要与 Worker 混淆 您指定的线程)。
我认为唯一存在的线程是我创建的用于从完成端口出列完成数据包的线程。完成端口创建的这个“并发线程”是什么?
【问题讨论】:
【参考方案1】:作者似乎没有完全理解完成端口。除了您引用的声明之外,该文章中还有一个图表再次包含“并发线程”一词。哪有这回事。完成端口的线程数设置是允许同时执行的线程数。
那篇文章中还有其他奇怪的东西。他正在创建一个套接字只是为了调用CreateIoCompletionPort
。在他破坏套接字之后立即。作者似乎相信他在网上其他地方看到的一些魔法咒语。不要太从字面上理解这篇文章。阅读 API 文档。
【讨论】:
【参考方案2】:IOCP 不会创建自己的线程。 IOCP 操作在 backgroup 中运行,然后将其结果发布到 IOCP 完成队列。 CreateIoCompletionPort()
的NumberOfConcurrentThreads
参数仅控制允许多少个工作线程同时处理完成数据包。这在 MSDN 文档中有说明。
I/O Completion Ports
尽管任意数量的线程都可以为指定的 I/O 完成端口调用 GetQueuedCompletionStatus,但是当指定的线程第一次调用 GetQueuedCompletionStatus 时,它会与指定的 I/O 完成端口相关联,直到发生以下三种情况之一: 线程退出,指定不同的 I/O 完成端口,或关闭 I/O 完成端口。换句话说,一个线程最多可以关联一个 I/O 完成端口。
当完成数据包排队到 I/O 完成端口时,系统首先检查与该端口关联的线程有多少正在运行。如果运行的线程数小于并发值(在下一节中讨论),则允许其中一个等待线程(最近的一个)处理完成数据包。当正在运行的线程完成其处理时,它通常会再次调用 GetQueuedCompletionStatus,此时它要么返回下一个完成数据包,要么等待队列为空。
...
要仔细考虑的 I/O 完成端口的最重要属性是并发值。完成端口的并发值是在使用 CreateIoCompletionPort 通过 NumberOfConcurrentThreads 参数创建时指定的。此值限制与完成端口关联的可运行线程的数量。当与完成端口关联的可运行线程总数达到并发值时,系统会阻止与该完成端口关联的任何后续线程的执行,直到可运行线程数降至并发值以下。
【讨论】:
以上是关于IOCP 是不是创建自己的线程?的主要内容,如果未能解决你的问题,请参考以下文章