2014-04-19 84 views
0

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

+0

第一个问题 - 你关闭你的应用程序,如果是,你需要关闭有问题的线程吗?如果要保存必须刷新到磁盘的数据或不能保持打开的数据库连接等? –

回答

0

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

以下是从文件采取的方法进行简单的描述:

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

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

关于ExitThread,这个更优雅,通过调用ExitThread,你告诉windows你已经完成了调用线程,所以剩下的代码不会被调用。如调用exit(0)

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

2

在Windows中关闭线程的”最好“方法是通过”告诉“线程通过某些关闭线程安全的信号机制,然后简单地让它自己消亡,如果需要完成检测(通常是这种情况),可能会等待它通过WaitForXXXX函数中的一个来实现(例如:

Main螺纹:

// 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++对象清理RAIL,其中既不是ExitThread也不是TerminateThread提供的。例如,ExitThread文档:

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

无论如何,开始简单。用超级简单的例子来处理事情,然后从那里开始工作。在网络上有一个多线程例子,从好的方面学习,并挑战自己去识别坏的方面。

祝你好运。