在Winapi中关闭Thread的有效方法是什么,线程不使用公共资源。 我正在使用CreateThread创建线程,但我不知道如何正确关闭它,因为有人建议使用TerminateThread,其他人使用ExitThread,但是关闭它的正确方法是什么。 另外我应该在WM_CLOSE或WM_DESTROY中调用关闭函数? Thx提前。
答案 0 :(得分:2)
在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 ++中 代码,你应该从你的线程函数返回。
无论如何,开始简单。通过超级简单的示例来处理事物,然后从那里开始工作。网上有一个 ton 的多线程示例,向好的人学习并挑战自己,找出不好的例子。
祝你好运。
答案 1 :(得分:0)
所以你需要弄清楚你需要做什么样的行为。
以下是对文档中采用的方法的简单描述:
“TerminateThread是一个危险的函数,只应该在最极端的情况下使用。只有在你确切知道目标线程正在做什么的情况下才应该调用TerminateThread,并且你可以控制目标线程可能的所有代码。在终止时运行。例如,TerminateThread可能导致以下问题: 如果目标线程拥有临界区,则不会释放临界区。 如果目标线程正在从堆中分配内存,则不会释放堆锁。 如果目标线程在终止时正在执行某些kernel32调用,则线程进程的kernel32状态可能不一致。 如果目标线程正在操纵共享DLL的全局状态,则DLL的状态可能会被破坏,从而影响DLL的其他用户。“
因此,如果您需要以任何代价终止线程,请调用此方法。
关于ExitThread,这更优雅。通过调用ExitThread,你告诉Windows你已经完成了调用线程,所以其余的代码不会被调用。这有点像调用exit(0)。
“ExitThread是退出线程的首选方法。当调用此函数时(显式或通过从线程过程返回),当前线程的堆栈被释放,线程发起的所有挂起I / O都被取消,如果线程是调用此函数时进程中的最后一个线程,则线程的进程也会终止。“