读书人

退出IOCP服务器时GetQueuedCompleti

发布时间: 2013-09-11 16:26:28 作者: rapoo

退出IOCP服务器时,GetQueuedCompletionStatus不返回
本帖最后由 fighton 于 2013-09-04 11:50:09 编辑


//IOCP工作线程
UINT WINAPI IOCPServer::WorkThread(LPVOID lpParam)
{
IOCPServer*pThis = (UdpServer *)lpParam;
DWORD dwTrans = 0, dwKey = 0;
LPOVERLAPPED pOl = NULL;

while (TRUE)
{
BOOL bOk = GetQueuedCompletionStatus(pThis->m_hCompletion, &dwTrans, &dwKey, (LPOVERLAPPED *)&pOl, WSA_INFINITE);

...

if (FALSE == InterlockedExchangeAdd(&(pThis->m_bThreadRun), 0))
{
Debug_Printf(_T("Worker thread(ID:%d)已退出."), GetCurrentThreadId());
supervisor.Log("工作线程(ID:%d)退出", GetCurrentThreadId());

break;
}
}


//关闭IOCP服务器
bool IOCPServer::Stop()
{
m_bSvrRunning = FALSE;
m_bThreadRun = FALSE;
SAFE_CLOSEHANDLE(m_hCompletion); //关闭完成端口的句柄
...
//等待所有工作线程退出
DWORD dwEvent = WaitForMultipleObjects(
m_nThread, // number of objects in array
m_pThreads, // array of objects
TRUE, // wait for all object
INFINITE);
}


关闭服务器时,发现最初创建的6个工作线程只退出5个,系统是Windows server 2003。原本以为把m_bThreadRun置成FALSE,并且关闭完成端口的句柄可以保证工作线程全部退出,但是还是失去控制。求能正确退出IOCP的方法。
[解决办法]
PostQueuedCompletionStatus
[解决办法]
for (int i = 0; i < nServerThreadNum; i++)
{
PostQueuedCompletionStatus(m_hCompletionPort, 0, 0, NULL);


}

有几个工作线程就发几个 然后在工作线程里面GetQueuedCompletionStatus判断key为0(一般是这样你也可以

自己定义,只要保证你退出Post那里的值能唯一代表退出就行) 就退出...

读书人网 >VC/MFC

热点推荐