微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐