如何关闭线程winapi

时间:2014-04-19 07:58:36

标签: multithreading winapi

在Winapi中关闭Thread的有效方法是什么,线程不使用公共资源。 我正在使用CreateThread创建线程,但我不知道如何正确关闭它,因为有人建议使用TerminateThread,其他人使用ExitThread,但是关闭它的正确方法是什么。 另外我应该在WM_CLOSE或WM_DESTROY中调用关闭函数?  Thx提前。

2 个答案:

答案 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, ExitThreadTerminateThread都不提供。例如,ExitThread文档:

  

...在C ++代码中,在调用任何析构函数之前退出该线程   或者可以执行任何其他自动清理。因此,在C ++中   代码,你应该从你的线程函数返回

无论如何,开始简单。通过超级简单的示例来处理事物,然后从那里开始工作。网上有一个 ton 的多线程示例,向好的人学习并挑战自己,找出不好的例子。

祝你好运。

答案 1 :(得分:0)

所以你需要弄清楚你需要做什么样的行为。

以下是对文档中采用的方法的简单描述:

“TerminateThread是一个危险的函数,只应该在最极端的情况下使用。只有在你确切知道目标线程正在做什么的情况下才应该调用TerminateThread,并且你可以控制目标线程可能的所有代码。在终止时运行。例如,TerminateThread可能导致以下问题: 如果目标线程拥有临界区,则不会释放临界区。 如果目标线程正在从堆中分配内存,则不会释放堆锁。 如果目标线程在终止时正在执行某些kernel32调用,则线程进程的kernel32状态可能不一致。 如果目标线程正在操纵共享DLL的全局状态,则DLL的状态可能会被破坏,从而影响DLL的其他用户。“

因此,如果您需要以任何代价终止线程,请调用此方法。

关于ExitThread,这更优雅。通过调用ExitThread,你告诉Windows你已经完成了调用线程,所以其余的代码不会被调用。这有点像调用exit(0)。

“ExitThread是退出线程的首选方法。当调用此函数时(显式或通过从线程过程返回),当前线程的堆栈被释放,线程发起的所有挂起I / O都被取消,如果线程是调用此函数时进程中的最后一个线程,则线程的进程也会终止。“