PostQueuedCompletionStatus函數,向每個工作者線程都發送—個特殊的完成數據包。該函數會指示每個線程都“立即結束並退出”.下面是PostQueuedCompletionStatus函數的定義:
BOOL PostQueuedCompletionStatus( HANDLE CompletlonPort, DW0RD dwNumberOfBytesTrlansferred, DWORD dwCompletlonKey, LPOVERLAPPED lpoverlapped, ); 其中,CompletionPort參數指定想向其發送一個完成數據包的完成端口對象。而就dwNumberOfBytesTransferred,dwCompletionKey和lpOverlapped這三個參數來說.每—個都允許我們指定—個值,直接傳遞給GetQueuedCompletionStatus函數中對應的參數。這樣—來。—個工作者線程收到傳遞過來的三個GetQueuedCompletionStatus函數參數後,便可根據由這三個參數的某一個設置的特殊值,決定何時應該退出。例如,可用dwCompletionPort參數傳遞0值,而—個工作者線程會將其解釋成中止指令。一旦所有工作者線程都已關閉,便可使用CloseHandle函數,關閉完成端口。最終安全退出程序。 PostQueuedCompletionStatus函數提供了一種方式來與線程池中的所有線程進行通信。如,當用戶終止服務應用程序時,我們想要所有線程都完全利索地退出。但是如果各線程還在等待完成端口而又沒有已完成的I/O 請求,那麼它們將無法被喚醒。 通過爲線程池中的每個線程都調用一次PostQueuedCompletionStatus,我們可以將它們都喚醒。每個線程會對GetQueuedCompletionStatus的返回值進行檢查,如果發現應用程序正在終止,那麼它們就可以進行清理工作並正常地退出。 |
#2 得分:24回覆於: 2009-05-15 09:02:21
PostQueuedCompletionStatus主要是投遞一個任務到完成隊列當中,從而使得在等待隊列消息的某一個線程收取到.其參與分別與GetQueuedCompletionStauts相對應,從而可以很方便地爲在等待完成消息的線程(池)分派任務,而不需要另外再開線程資源.基於這一種特性,還可以把完成端口當成一個高效的隊列+線程池.正如1樓說的,如果你是想退出線程的話,也可以通過這種方式投遞特定的消息.由於退出消息一個線程只會處理一個(這個邏輯問題應該不用解釋),所以如果想讓所有業務線程退出,就只需要根據線程數量投遞多個退出消息即可.
|