当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声明:“每当该操作完成时,它将在该I/O完成端口上排队。然后端口将继续并使用线程池的一个线程来运行您指定的回调。”
发布于 2012-11-01 21:27:30
可能更容易将I/O完成端口简单地看作是线程安全队列,操作系统将重叠操作的结果放在它们完成后为您准备。
创建IOCP,然后创建一些线程,这些线程调用一个函数从这个队列中删除项。一般来说,这是GetQueuedCompletionStatus()。这个函数实质上阻止线程,直到IOCP (队列)中有内容,然后允许线程检索该内容并运行。
您将文件句柄和套接字与IOCP相关联,这意味着一旦关联,它们的重叠完成将被放置在IOCP (队列)中。
这比那复杂多了,但你应该这么想。
https://stackoverflow.com/questions/13178248
复制相似问题