IO完成端口是否在完成端口报告之前或之后生成新线程?

时间:2012-11-01 13:37:43

标签: 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完成端口上排队一个数据包。然后该端口将继续并使用其中一个线程池的线程来运行你指定的回调。“

1 个答案:

答案 0 :(得分:5)

将I / O完成端口简单地想象为一个线程安全队列可能更容易,操作系统在完成后将重叠操作的结果放入其中。

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

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

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