背景:
我的C++应用程序创建了一个工作线程,该线程使用CreateThread()
创建了两个线程。工作线程创建的这两个线程通过客户端与WCF服务通信,该客户端使用Windows Web Services API实现,该API提供了用于构建基于SOAP的Web服务和客户端的C/C++应用程序编程接口(API)。我的应用程序仅使用此API实现了客户端。
问题:
我面临的问题是,除了工作线程外,所有其他线程都会优雅地退出,正如您自己在下面的图像中所看到的那样,WorkerThreadProc
不使用CPU周期,但它不会退出。还有一些其他正在运行的线程,它们不是由我创建的,而是由运行时创建的。
线程状态如下(由ProcessExplorer报告):
WorkerThreadProc
处于Wait:WrUserRequest状态。wWinMainCRTStartup
处于Wait:UserRequest状态。- 所有
TpCallbackIndependent
都处于Wait:WrQueue状态。
他们在等什么?我需要查看哪些可能的原因?WrUserRequest和UserRequest之间有什么区别?WrQueue是什么意思?我绝对不知道这里发生了什么。
这是我的WorkerThreadProc代码。我已经删除了除函数底部的最后一个日志语句外的所有日志语句:
DWORD WINAPI WorkerThreadProc(PVOID pVoid)
{
//Initialize GDI+
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Status status = GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
if ( status != Status::Ok )
{
return 1;
}
GuiThreadData *pGuiData = (GuiThreadData*)pVoid;
auto patternIdRequestQueue= new PatternIdRequestQueue();
auto resultQueue = new ResultQueue();
auto patternManager = new PatternManager(patternIdRequestQueue);
LocalScheduler *pScheduler = new LocalScheduler(resultQueue, patternManager);
bool bInitializationDone = pScheduler->Initialize(pGuiData->m_lpCmdLine);
if ( !bInitializationDone )
{
return 0;
}
//PatternIdThread
PatternIdThread patternIdThread(patternIdRequestQueue);
DWORD dwPatternIdThreadId;
HANDLE hPatternIdThread = CreateThread(NULL, 0, PatternIdThreadProc, &patternIdThread, 0, &dwPatternIdThreadId);
ResultPersistence resultPersistence(resultQueue);
DWORD dwResultPersistenceThreadId;
HANDLE hResultPersistenceThread = CreateThread(NULL, 0, ResultPersistenceThreadProc, &resultPersistence, 0, &dwResultPersistenceThreadId);
pScheduler->ScheduleWork(pGuiData->m_hWnd, pGuiData->m_hInstance, ss.str());
pScheduler->WaitTillDone();
patternIdThread.Close();
resultPersistence.Close();
delete pScheduler;
//Uninitialize GDI+
GdiplusShutdown(gdiplusToken);
dwRet = WaitForSingleObject(hPatternIdThread, INFINITE);
CloseHandle(hPatternIdThread);
dwRet = WaitForSingleObject(hResultPersistenceThread,INFINITE);
CloseHandle(hResultPersistenceThread);
SendMessage(pGuiData->m_hWnd, WM_CLOSE, 0, 0);
//IMPORTANT : this verbose message is getting logged!
T_VERBOSE(EvtSrcInsightAnalysis, 0, 0, "After sending message to destroy window");
delete patternManager;
delete patternIdRequestQueue;
delete resultQueue;
return 0;
}
请查看
T_VERBOSE
宏,它用于记录详细信息。我发现消息已经被记录了,但线程没有退出!编辑:我只是在WorkerThreadProc
中注释了以下行,然后工作线程正常退出!SendMessage(pGuiData->m_hWnd, WM_CLOSE, 0, 0);
这是否意味着
SendMessage
是罪魁祸首?为什么会阻塞调用线程?
WaitForSingleObject
等待线程完成! - Nawazboost::thread
在内部使用什么? - Nawazboost::thread
的问题,你觉得怎么样?我认为你的论点不够有力。 - Nawaz