5

对于 IO 完成端口完成时实际发生的情况,我有点困惑。

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

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

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

4

1 回答 1

6

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

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

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

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

于 2012-11-01T21:27:30.300 回答