void __cdecl CIocpSock::MyProc(void * pParam)
{
CIocpSock * pthis = (CIocpSock *)pParam;
HANDLE hCompletionPort = pthis->m_hCompletionPort;
ULONG_PTR nIndex;
OVERLAP_PLUS * pOverlapPlus;
DWORD nSize;
LPOVERLAPPED pOverlapped;
BOOL succeed;

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;
}多个线程的时候,发现,线程函数已经break了,但是WaitForSingleObject有时很正常,有时还是会阻塞,比如开6个线程,在第3个WaitForSingleObject时阻塞住,但是线程函数已经break 6次了。我用的是win7 64位系统,vs2010,请大家指点迷津,多谢多线程TCP/IP完成端口

解决方案 »

  1.   

    for (i=0; i<m_nThread; i++)
        {
            if (m_hThreads[i] != NULL)
            {
                ::WaitForSingleObject(m_hThreads[i], INFINITE);
                m_hThreads[i] = NULL;
            }
        }
    放到另外的线程里做,而且这个线程得比下面的这几段先运行。有可能是线程m_hThreads[i]结束后才用WaitForSingleObject导致无效了
     for (i=0; i<m_nThread; i++)
        {
            ::PostQueuedCompletionStatus(m_hCompletionPort, 
                0, (DWORD)m_nClient, NULL);
        }
      

  2.   

    我映像中,对于已经退出运行的线程句柄调用WaitForSingleObject,则马上返回,这个与表示线程已经结束行为上也保持一致,不知道windows是不是。
      

  3.   

    post的时候overlappe结构之间NULL,然后getqs的时候判断一下是否为特殊标记
      

  4.   

    为什么不用waitformultipleobjects(m_hThreads[i],TRUE),等待多个线程一起退出后,函数才能返回,否则一直阻塞