PostQueuedCompletionStatus函数提供了一种方式来与线程池中的所有线程进行通信。如,当用户终止服务应用程序时,我们想要所有线程都完全利索地退出。但是如果各线程还在等待完成端口而又没有已完成的I/O 请求,那么它们将无法被唤醒。
通过为线程池中的每个线程都调用一次PostQueuedCompletionStatus,我们可以将它们都唤醒。每个线程会对GetQueuedCompletionStatus的返回值进行检查,如果发现应用程序正在终止,那么它们就可以进行清理工作并正常地退出。
使用这种线程终止技术须保证线程池中的线程正在退出,不会再次调用GetQueuedCompletionStatus。如果想要通知线程池中的每个线程发生了某些事情,让它们进入下一次循环并再次调用GetQueuedCompletionStatus:问题就来了,这是因为线程是以后入先出的方式被唤醒的。因此,为了确保线程池中的每个线程都能有机会得到模拟的I/O项,还必须在应用程序中采用其它线程同步机制,否则,同一个线程可能会多次得到相同的通知。
Vista中,当调用CloseHandle并传入一个完成端口的句柄时,系统就会将所有正在等待GetQueuedCompletionStatus返回的线程唤醒。并返回FALSE给它们。此时调用GetLastError会返回ERROR_INVALID_HANDLE。线程可以通过这种方式来知道自己应该得体地退出了。
转载于:https://blog.51cto.com/laokaddk/288389