IOCP是否创建了自己的线程?

时间:2015-02-21 17:27:42

标签: c++ windows sockets winapi iocp

我正在学习IOCP,并根据此article

  

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

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

2 个答案:

答案 0 :(得分:10)

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

该文章中还有其他奇怪的内容。他只是为了调用CreateIoCompletionPort而创建了一个套接字。在他摧毁插座后立刻。作者似乎相信他在网上其他地方看到的一些神奇的咒语。不要过于字面地理解这篇文章。阅读API文档。

答案 1 :(得分:4)

IOCP不会创建自己的线程。 IOCP操作在backgroup中运行,然后将其结果发布到IOCP完成队列。 NumberOfConcurrentThreads的{​​{1}}参数仅控制允许多少工作线程同时处理完成数据包。这在MSDN文档中有解释。

I/O Completion Ports

  

虽然任何数量的线程可以调用GetQueuedCompletionStatus时为指定的I / O完成端口,当一个指定的线程调用GetQueuedCompletionStatus第一次,它变成与指定的I / O完成端口,直到三件事情之一发生相关联:该线程退出,指定不同的I / O完成端口,或关闭I / O完成端口。换句话说,单个线程最多可以与一个I / O完成端口相关联。

     

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

     

...

     

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

相关问题