首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

完成端口实现中,线程已经退出,但是WaitForSingleObject依然阻塞,该如何解决

2013-10-21 
完成端口实现中,线程已经退出,但是WaitForSingleObject依然阻塞void __cdecl CIocpSock::MyProc(void * pP

完成端口实现中,线程已经退出,但是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;
}

多个线程的时候,发现,线程函数已经break了,但是WaitForSingleObject有时很正常,有时还是会阻塞,比如开6个线程,在第3个WaitForSingleObject时阻塞住,但是线程函数已经break 6次了。我用的是win7 64位系统,vs2010,请大家指点迷津,多谢 多线程 TCP/IP 完成端口
[解决办法]
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);
????}
[解决办法]
我映像中,对于已经退出运行的线程句柄调用WaitForSingleObject,则马上返回,这个与表示线程已经结束行为上也保持一致,不知道windows是不是。
[解决办法]
post的时候overlappe结构之间NULL,然后getqs的时候判断一下是否为特殊标记
[解决办法]
为什么不用waitformultipleobjects(m_hThreads[i],TRUE),等待多个线程一起退出后,函数才能返回,否则一直阻塞 

热点排行