Multithreading 如何关闭winapi线程

Multithreading 如何关闭winapi线程,multithreading,winapi,Multithreading,Winapi,Winapi中关闭线程的正确方法是什么,线程不使用公共资源。 我正在使用CreateThread创建线程,但我不知道如何在中正确关闭它,因为有人建议使用TerminateThread,其他人退出线程,但关闭它的正确方法是什么。 我应该在哪里调用WM_CLOSE或WM_DESTROY中的关闭函数? Thx提前 所以你需要弄清楚你需要什么样的行为 以下是从文档中获取的方法的简单说明: “TerminateThread是一种危险的功能,只能在最极端的情况下使用。如果您确切知道目标线程正在做什么,并且您

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

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

以下是从文档中获取的方法的简单说明:

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

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

关于ExitThread,这更优雅。通过调用ExitThread,您告诉windows您已经完成了该调用线程,因此不会调用其余代码。这有点像调用exit(0)

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

在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
终止子线程,因为根本不执行逻辑清理。中指定的警告是不言自明的,应予以注意。伴随着强大的力量

最后,即使调用线程调用<代码> ExtType 不是您明确要求的,尽管您可以这样做,但我强烈建议在C++程序中使用<强>反对>。一旦线程过程从

ThreadProc
逻辑返回,就会调用它。我更喜欢上面的模型,因为它很容易实现,并支持C++对象清理的完整RAII,既没有<代码> ExtType < /C>也不<代码>终止线程< /COD>提供。例如,
ExitThread
文档:

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

无论如何,从简单开始。用超级简单的例子来处理事情,然后从那里开始工作。网络上有大量多线程的例子,从好的例子中学习,并挑战自己找出坏的例子


祝您好运。

第一个问题-您是否正在关闭应用程序,如果是,是否需要“关闭”有问题的线程?if是否保留必须刷新到磁盘的数据,或不允许打开的DB连接等?