关于IOCP完成端口这个PostQueuedCompletionStatus函数运用问题

PostQueuedCompletionStatus(

  HANDLE CompletionPort,
  DWORD dwNumberOfBytesTransferred,
  ULONG_PTR dwCompletionKey,
  LPOVERLAPPED lpOverlapped
)

  关于这个函数,网上几乎都是......经常用于退出时发送一个模拟的IO完成事件来唤醒在等待中的线程,显然很多人都仅仅用在系统退出的时候作为唤醒线程作用。

  然而在一些论文里面,我们才能看到对于这个函数的一些非常有用的论点。只有提及,没有具体的代码。但是这不重要。

  因此,我个人判断,应该大多数人采用WSASend发送数据的时候,是通过主线程调用的。在这里我说下,这样可能不是很好。因为很明显,主线程直接参与到工作线程的调度当中了。不仅仅是效率问题了。具体会涉及到哪种问题,这个就不得而知了。这里不做讨论。

  正确的做法是:我们应该调用PostQueuedCompletionStatus函数来发送数据,把控制权交给工作者线程来调度。这样一来就完全变成所有的接收和发送都是由工作者线程来完成。主线程只需要处理完成后的数据就OK了。

  因为我们知道,IOCP完成端口涉及到系统内核的各种问题,为了稳定和系统性能效率而言,采用主线程(外部处理程序)和工作者线程运行分离机制是比较明智的。

  具体如何运用,看它的几个参数就OK,太简单了。

猜你喜欢

转载自www.cnblogs.com/GameDelphi/p/9187689.html