在《 WinSock编程基础:编译》一书中,有针对IOCP的以下图表:
我知道完成通知到达完成端口,并且四个排队的线程调用GetQueuedCompletionStatus()
来获取完成数据包。但是,在完成端口下方显示的其他两个工作线程有什么作用,难道这些线程也调用GetQueuedCompletionStatus()
但它们已经收到了完成数据包,并且正在处理它吗?
最佳答案
就像马丁·詹姆斯(Martin James)在评论中所说的那样;排队线程和工作线程都是已调用GetQueuedCompletionStatus()
的线程。被指定为工作线程的线程已经完成处理,并且正在这样做。被指定为“排队线程”的线程正在等待完成更多操作,或者由于创建它的并发值而被IOCP阻塞。如果稍后,它们将等待工作线程之一阻塞IOCP API知道的API。如果一个工作线程完成对当前完成的处理,则它将进入不 Activity 线程队列的最前面(因此,允许IOCP提供其LIFO功能,该功能可保持 Activity 线程的 Activity ,从而有助于减少上下文切换和内存故障)。