windows - IO 完成端口是否在完成端口有要报告的内容之前或之后生成新线程?

标签 windows winapi iocp

我对 IO 完成端口完成时实际发生的事情感到有点困惑。

我假设 Win API 允许访问 IOCP 队列,该队列能够以某种方式对具有特定句柄(比方说套接字)的回调引用进行排队(或堆叠)。 当 Windows 从 NIC 接收到中断时,它会在某个时候进入 NIC 的 IOCP 队列并在其自己的 (IOCP) 线程池上执行回调。

我的问题是,线程池中的这个线程是在收到中断时生成的,还是实际上是在调用 Win API 时生成的,有效地让线程处于等待状态,直到它被唤醒通过 IOCP 队列?

编辑:
我发现了这个:http://msmvps.com/blogs/luisabreu/archive/2009/06/04/multithreading-i-o-and-the-thread-pool.aspx其中声明:“每当该操作完成时,它将在该 I/O 完成端口上排队一个数据包。然后该端口将继续并使用线程池的线程之一来运行您指定的回调。”

最佳答案

将 I/O 完成端口简单地视为一个线程安全队列可能更容易,操作系统会在重叠操作完成时为您将其放入其中。

您创建 IOCP,然后创建一些线程,这些线程调用一个函数从该队列中删除项目。通常这是 GetQueuedCompletionStatus() .此函数实质上会阻塞您的线程,直到 IOCP(队列)中有内容,然后允许您的线程检索该内容并运行。

您将文件句柄和套接字与 IOCP 相关联,这仅意味着一旦相关联,它们的重叠完成将为您放置在 IOCP(队列)中。

它比那更复杂,但这是你应该思考的方式。

关于windows - IO 完成端口是否在完成端口有要报告的内容之前或之后生成新线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13178248/

相关文章:

windows - 如何在 UWP 上的 Xamarin.Forms WebView 中启用 WebGL?

windows - MSI Windows 中的较大 IRQ 值

c++ - 使用 IOCP 时,我应该将 WSAOVERLAPPED 的 hEvent 设置为 NULL 还是 WSAEVENT 对象的有效句柄?

c++ - 进程在内存/Win32 调试 API 中的真实起始地址

c++ - Windows API,__declspec(thread) vs CreateThread?

c++ - 优化 I/O 绑定(bind)的 Win32 应用程序

c++ - 将调用线程置于可警告等待状态

c# - 如何查找正确的 Windows 系统错误代码以在我的应用程序中使用?

xml - 如何在perfmon中获取同一进程的所有实例

c++ - 具有相对路径的 CFileDialog