您的位置:首页 > 产品设计 > UI/UE

PostQueuedCompletionStatus函数

2015-03-13 11:12 411 查看
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的返回值进行检查,如果发现应用程序正在终止,那么它们就可以进行清理工作并正常地退出。

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理





unsigned
僵哥
本版等级:



 

 

更多勋章
#2 得分:24回复于: 2009-05-15 09:02:21

PostQueuedCompletionStatus主要是投递一个任务到完成队列当中,从而使得在等待队列消息的某一个线程收取到.其参与分别与GetQueuedCompletionStauts相对应,从而可以很方便地为在等待完成消息的线程(池)分派任务,而不需要另外再开线程资源.基于这一种特性,还可以把完成端口当成一个高效的队列+线程池.正如1楼说的,如果你是想退出线程的话,也可以通过这种方式投递特定的消息.由于退出消息一个线程只会处理一个(这个逻辑问题应该不用解释),所以如果想让所有业务线程退出,就只需要根据线程数量投递多个退出消息即可.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: