读书人

IOCP工作线程求科普解决方案

发布时间: 2013-07-16 22:38:05 作者: rapoo

IOCP工作线程求科普

DWORD WINAPI CSessionManager::_RecvWorkThread(LPVOID lpParam)
{
return GetInstance()->RecvWorkThread(lpParam);
}

DWORD CSessionManager::RecvWorkThread(LPVOID lpParam)
{
int nRet = ERR_NONE;
DWORD dwTransferred;
CSession* pSession = NULL;
LPKG_SOCKET_DATA lpSockData = NULL;

while (m_isSrvRun)
{
dwTransferred = 0;
if (GetQueuedCompletionStatus(m_hCompletionPort, &dwTransferred, (PULONG_PTR)pSession, (LPOVERLAPPED *)&lpSockData, WSA_INFINITE))
{
if (dwTransferred == 0)
{//SOCKET 异常

}
else
{
switch (lpSockData->opType)
{
case IO_READ:
{
pSession->RecvDbData(lpSockData, dwTransferred);
}
break;
case IO_WRITE:
break;
case IO_ACCEPT:


break;
default:
//assert(0)
break;
}
}
}
else
{//与客服端断开连接

}
Sleep(1);//
}
return (DWORD)nRet;
}



为什么不加Sleep(1), CPU会变成100%占用。GetQueuedCompletionStatus不是阻塞住了么。 IOCP?CPU
[解决办法]
单步调试下吧

[解决办法]
应该和sleep(1)没关系的。
是不是其他的代码有问题?
[解决办法]
figure out what the most time-consuming part using a profiler
[解决办法]
看一下可能是GetQueuedCompletionStatus失败,出现死循环 。

读书人网 >C++

热点推荐