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

退出IOCP服务器时,GetQueuedCompletionStatus不回来

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

退出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那里的值能唯一代表退出就行) 就退出...

热点排行