PostQueuedCompletionStatus(
HANDLE CompletionPort,
DWORD dwNumberOfBytesTransferred,
ULONG_PTR dwCompletionKey,
LPOVERLAPPED lpOverlapped
)
关于这个函数,网上几乎都是......经常用于退出时发送一个模拟的IO完成事件来唤醒在等待中的线程,显然很多人都仅仅用在系统退出的时候作为唤醒线程作用。
然而在一些论文里面,我们才能看到对于这个函数的一些非常有用的论点。只有提及,没有具体的代码。但是这不重要。
因此,我个人判断,应该大多数人采用WSASend发送数据的时候,是通过主线程调用的。在这里我说下,这样可能不是很好。因为很明显,主线程直接参与到工作线程的调度当中了。不仅仅是效率问题了。具体会涉及到哪种问题,这个就不得而知了。这里不做讨论。
正确的做法是:我们应该调用PostQueuedCompletionStatus函数来发送数据,把控制权交给工作者线程来调度。这样一来就完全变成所有的接收和发送都是由工作者线程来完成。主线程只需要处理完成后的数据就OK了。
因为我们知道,IOCP完成端口涉及到系统内核的各种问题,为了稳定和系统性能效率而言,采用主线程(外部处理程序)和工作者线程运行分离机制是比较明智的。
具体如何运用,看它的几个参数就OK,太简单了。