完成端口实现中,线程已经退出,但是WaitForSingleObject依然阻塞
void __cdecl CIocpSock::MyProc(void * pParam)
{
CIocpSock *pthis = (CIocpSock *)pParam;
HANDLEhCompletionPort = pthis->m_hCompletionPort;
ULONG_PTRnIndex;
OVERLAP_PLUS *pOverlapPlus;
DWORDnSize;
LPOVERLAPPEDpOverlapped;
BOOLsucceed;
for (;;)
{
pOverlapped = NULL;
nIndex = int(pthis->m_nClient);
succeed = ::GetQueuedCompletionStatus(hCompletionPort,
&nSize,&nIndex, &pOverlapped, INFINITE);
if (size_t(nIndex) >= pthis->m_nClient)
{
//这里确定线程已经退出
break;
}
pOverlapPlus = (OVERLAP_PLUS *)pOverlapped;
if (succeed)
{
if (pOverlapPlus)
{
switch (pOverlapPlus->nType)
{
case IO_WRITE:
pthis->OnWrite(nIndex, nSize);
break;
case IO_READ:
pthis->OnRead(nIndex, nSize);
break;
case IO_INIT:
pthis->OnInit(nIndex, nSize);
break;
}
}
}
else
{
pthis->Close(nIndex);
}
if (pOverlapPlus)
{
DeleteOverlapPlus(pOverlapPlus);
}
}
}
bool CIocpSock::Shutdown()
{
size_t i;
for (i=0; i<m_nThread; i++)
{
::PostQueuedCompletionStatus(m_hCompletionPort,
0, (DWORD)m_nClient, NULL);
}
for (i=0; i<m_nThread; i++)
{
if (m_hThreads[i] != NULL)
{
::WaitForSingleObject(m_hThreads[i], INFINITE);
m_hThreads[i] = NULL;
}
}
if (m_hCompletionPort)
{
::CloseHandle(m_hCompletionPort);
m_hCompletionPort = NULL;
}
return true;
}