1.当多个线程在套接字上执行I/O 操作时,应当避免重叠操作正在进行的时候释放了OVERLAPPED 结构,阻止其发生的最好方法是在每个套接字句柄上调用closesocket函数--------------所有未决的I/O 操作都会完成为什么?2.上述方法可以通过使用PostQueuedCompletionStatus函数向工作线程发送特定的完成封包来实现,这个完成封包通知工作线程立即退出发送什么样的封包呢?3.当工作线程接收GetQueuedCompletionStatus的3个参数时,可以决定是否退出。发送什么样的参数呢?dwCompletionkey传递0.其实这三个问题是一个问题,书上说的很模糊,我把它分开问,各位高手回答也方便一些,我也更容易理解一些,拜托了。

解决方案 »

  1.   

    1:关闭每个关联到完成端口的socket,
    2,3:PostQueuedCompletionStatus(m_hCompletion, -1, 0, NULL);
    BOOL bOK = ::GetQueuedCompletionStatus(m_hCompletion, &dwTrans, (LPDWORD)&dwKey, (LPOVERLAPPED*)&lpol, WSA_INFINITE);
    if(dwTrans == -1) // 用户通知退出,你自己决定是对否退出
    {}
      

  2.   

    1.如果能这样子做当然是最好不过,通常这种也是比较理想的。即先关闭Listen Socket,然后socket逐一关闭。
    2,3.是同一个问题。问题1当中这种理想做法很难实现,几乎是不可能实现。那么就只要做到不让后续的线程重复释放资源。做法就是先给每一个线程发送一个退出的通知,这个通知可以通过PostQueuedCompletionStatus带上特定的参数,当GetQueuedCompletionStatus收到特定的参数之后,就自行退出,而不再处理后续的通知。如此就可以避免了对野指针释放资源的问题。