【发布时间】:2012-10-22 02:37:53
【问题描述】:
对于 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 where is states: “每当该操作完成时,它将在该 I/O 完成端口上排队一个数据包。然后该端口将继续并使用线程池的线程之一来运行回调你已经指定了。”
【问题讨论】:
-
只是为了澄清,这是一个关于重叠 IO 如何管理事件通知的接收在将其带到 IOCP 用户管理的线程池的问题,对吗?跨度>
-
没有。 IOCP创建的线程是在端口有一些IO之前创建的(在这种情况下它们被阻塞),还是在端口有一些IO要报告的时候创建线程是一个问题。
-
不太清楚你在说什么。中断由驱动程序处理。您的代码是使用 GetQueuedCompletionStatus() 还是后来的 CreateThreadPoolIo() 很重要。在第一种情况下,您创建 tp 线程。在最后一种情况下,Windows 在重叠 I/O 完成时创建它。
-
I/O 完成端口不创建线程。 您在调用 GetQueueCompletionStatus 时创建线程并将它们订阅到 IOCP。
-
@lejon:如果您调用
GetQueuedCompletionStatus()并将其dwMillisecond参数设置为非零值,那么是的,调用线程将被阻塞,直到IOCP 完成或超时结束,以两者为准首先发生。