关闭

完成端口与套接字绑定的OVERLAPPED结构释放问题

标签: 工作
5425人阅读 评论(0) 收藏 举报
分类:
2楼  kingzai   (stevenzhu) 五星用户 该版得分小于等于200000分,大于100000分  回复于 2005-01-09 13:58:59  得分 30

如何正确地关闭I/O完成端口一—特别是同时运行了一个或多个线程,在几个不同的套接字上执行I/O操作的时候。要避免的一个重要问题是在进行重叠I/O操作的同时,强行释放—个OVERLAPPED结构。要想避免出现这种情况,最好的办法是针对每个套接字句柄,调用closesocket函数。任何尚未进行的重叠I/O操作都会完成。—旦所有套接字句柄都已关闭。便需在完成端口上,终止所有工作者线程的运行。要想做到这一点,需要使用  
  PostQueuedCompletionStatus函数,向每个工作者线程都发送—个特殊的完成数据包。该函数会指示每个线程都“立即结束并退出”.下面是PostQueuedCompletionStatus函数的定义:    
  BOOL   PostQueuedCompletionStatus(  
          HANDLE   CompletlonPort,  
          DW0RD     dwNumberOfBytesTrlansferred,  
          DWORD     dwCompletlonKey,  
  LPOVERLAPPED   lpoverlapped,  
  );  
          其中,CompletionPort参数指定想向其发送一个完成数据包的完成端口对象。而就dwNumberOfBytesTransferred,dwCompletionKey和lpOverlapped这三个参数来说.每—个都允许我们指定—个值,直接传递给GetQueuedCompletionStatus函数中对应的参数。这样—来。—个工作者线程收到传递过来的三个GetQueuedCompletionStatus函数参数后,便可根据由这三个参数的某一个设置的特殊值,决定何时应该退出。例如,可用dwCompletionPort参数传递0值,而—个工作者线程会将其解释成中止指令。一旦所有工作者线程都已关闭,便可使用CloseHandle函数,关闭完成端口。最终安全退出程序。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:193360次
    • 积分:2656
    • 等级:
    • 排名:第14194名
    • 原创:66篇
    • 转载:9篇
    • 译文:0篇
    • 评论:19条
    最新评论