IOCP是否创建自己的线程
Does IOCP creates its own threads?
我正在学习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参数创建完成端口时,会指定该端口的并发值。此值限制与完成端口关联的可运行线程的数量。当与完成端口相关的可运行的线程总数达到并发值时,系统将阻止与该完成端口相关联的任何后续线程的执行,直到可运行线程数量降至并发值以下。
- 线程之间的布尔停止信号
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 如何从线程中的不同模块调用函数?
- 将线程中的数据存储到全局容器的最佳方法?
- 使用 ubuntu 终端在 c++ 上运行线程类的问题
- 如何声明由多个线程调用的 C++ DLL 的内部类,而无需导出类
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程之间的实时数据共享
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 线程调用的函数对对象删除是否安全?
- 线程之间的通信不起作用 - C++
- 琐碎并发代码的吞吐量不会随着线程数量的增加而增加
- 如何以线程安全的方式更改目录?
- 线程安全的引用计数队列C++
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- 由并发无序映射查找线程调用的函数是否安全?
- 我可以计算多线程数的平均值吗?
- 子线程中的条件变量等待停止主线程中的执行
- 在 MFC 对话框和自己的线程上的 OpenGL 控件之间传递消息
- 是否有任何cpp函数或对象(不包括从c继承的)不是线程安全的,即使每个线程对自己的数据进行操作