您的位置:首页 > 其它

如何正确的创建线程,终了线程(2)

2013-10-11 14:51 176 查看
上一讲我们说了Win32下如何创建线程,这一讲我们来说线程是如何终止的。
2>线程是如何终止的呢

 线程函数返回

 线程通过调用ExitThread函数“杀死”自己

 同一进程或另一进程中调用TerminateThread函数

 包含线程的进程终止

线程函数返回

设计线程函数时,应该确保线程结束时,线程函数就返回。这是确保线程函数所有资源释放的唯一途径。那么函数返回可以确保哪些资源被正确释放呢?

 线程中所创建的所有C++对象都通过其析构函数被正确释放。

 操作系统正确释放线程栈。

 操作系统把线程退出码设为线程返回值。(内核对象维护)

 操作系统减少线程内核对象的引用计数。

线程通过调用ExitThread函数“杀死”自己

函数终止线程运行,并使操作系统清理该线程中使用的操作系统资源,而C++资源(C++对象)不会被释放。

函数原型:

VOID ExitThread(

DWORD dwExitCode // exit code for this thread

);

但是可以通过设置参数dwExitCode 告诉操作系统线程的退出码设为什么。

我们可以通过GetExitCodeThread函数获取线程退出码,来明白线程退出时的状况。

※如何C/C++代码不要调用ExitThread(Windows函数),应该使用C++运行时库函数__endthreadex


同一进程或另一进程中调用TerminateThread函数


函数能“杀死”任何线程,调用TerminateThread杀死线程时,参数dwExitCode 变成线程退出码。线程内核对象的引用计数减少。线程拥有的堆栈直到拥有该线程的进程终止才释放。

函数原型:

BOOL TerminateThread(

HANDLE hThread, // handle to thread

DWORD dwExitCode // exit code

);

包含线程的进程终止

ExitProcess和TerminateProcess也可以终止线程的运行,这些函数会终止该进程中所有的运行的线程。所使用的资源会被清理。

※线程状态的侦测:

BOOL GetExitCodeThread(

HANDLE hThread, // handle to the thread

LPDWORD lpExitCode // termination status

);

lpExitCode 指向线程函数的退出码,线程未退出时,指向STILL_ACTIVE(0x103)值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程 win32 内核 对象