TerminateThread 强制另一个线程退出。你应该不惜一切代价避免调用它,因为它会阻止一个线程死在它的轨道上,而没有任何清理的机会。这包括分配的任何 CRT 内存。
ExitThread 是为了让当前运行的线程干净利落地停止自己。当您在上面调用它时,您可能会强制主 (UI) 线程退出,并可能让正在运行的线程仍然徘徊。因此,您的程序仍在运行,正如任务管理器中所证明的那样。GetExitCodeThread 也可能失败,因为线程实际上并未退出。
但是停止线程的正确方法是通过任何必要的干净方式发出干净的信号,表明它应该退出。 然后在允许主线程退出之前让线程自行退出。在下面的示例中,我使用了一个全局标志来指示线程它们应该退出。但这假设您的线程将始终有机会轮询全局 bool 状态。另一种更简洁的方法是让每个线程在事件句柄上调用 WaitForSingleObject。当事件句柄发出信号时,线程检查全局变量并在需要时退出。
bool global_Need_ToExit; // use a bool or replace with an event handle the thread shoudl wait on
void CleanAll()
{
//signal all threads to exit
global_Need_ToExit = true;
DWORD dwExit[MAX_THREAD];
for(int i = 0; i < MAX_THREAD; i++)
{
// actually wait for the thread to exit
WaitForSingleObject(hThread[i], WAIT_INFINITE);
// get the thread's exit code (I'm not sure why you need it)
GetExitCodeThread(hThread[i], &dwExit[i]);
// cleanup the thread
CloseHandle(hThread[i]);
hThread[i] = NULL;
}
}
DWORD __stdcall YourThreadFunction(void* pData)
{
while (global_Need_To_Exit == false)
{
// do more work
}
return 0; // same as ExitThread(0);
}