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

我对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(队列)中.

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

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...