在 Windows 中关闭线程的“最好”方法是通过某种线程安全的信号机制“告诉”线程关闭,然后简单地让它自行结束,可能等待它通过一个如果需要完成检测(通常是这种情况),则使用 WaitForXXXX 函数。比如:
主线程:
// some global event all threads can reach
ghStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
// create the child thread
hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
//
// ... continue other work.
//
// tell thread to stop
SetEvent(ghStopEvent);
// now wait for thread to signal termination
WaitForSingleObject(hThread, INFINITE);
// important. close handles when no longer needed
CloseHandle(hThread);
CloseHandle(ghStopEvent);
子线程:
DWORD WINAPI ThreadProc(LPVOID pv)
{
// do threaded work
while (WaitForSingleObject(ghStopEvent, 1) == WAIT_TIMEOUT)
{
// do thread busy work
}
return 0;
}
显然,一旦您开始将其付诸实践,事情就会变得更加复杂。如果您所说的“公共”资源是指前面示例中的 ghStopEvent 之类的东西,那么它变得更加困难。 强烈不鼓励通过TerminateThread 终止子线程,因为根本没有执行逻辑清理。 `TerminateThread documentation 中指定的警告是不言自明的,应予以注意。强大的力量来了......
最后,即使是调用ExitThread 的调用 线程也不是明确要求你,虽然你可以这样做,但我强烈在 C++ 程序中建议反对它。一旦线程过程从ThreadProc 逻辑返回,它就会被为你调用。我更喜欢上面的模型只是因为它很容易实现并且支持 C++ 对象清理的完整 RAII,ExitThread 和 TerminateThread 都不提供。例如,ExitThread 文档:
...在 C++ 代码中,线程在调用任何析构函数之前退出
或者可以执行任何其他自动清理。因此,在 C++
代码,你应该从你的线程函数返回。
无论如何,从简单开始。用超级简单的例子来处理事情,然后从那里开始。网络上有 吨 多线程示例,向好的示例学习并挑战自己以识别坏的示例。
祝你好运。