我对 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/