终止运行线程的注意事项

终止运行线程

1. 线程函数返回。

2. 线程通过调用ExitThread函数“杀死”自己(避免使用)。

3. 同一个进程或另一个进程中的线程调用TerminateThread函数(避免使用)

4. 包含线程的进程终止运行(避免使用)

 

让线程函数返回,可以确保:

1. 线程函数中创建的所有C++对象都通过其析构函数被正确的销毁;

2. 操作系统正确释放线程栈使用的内存;

3. 操作系统把线程的退出代码设为线程函数的返回值;

4. 系统递减少线程的内核对象的使用计数。

 

使用ExitThread函数终止线程,并导致操作系统清理该线程使用的所有操作系统资源。但是,C++资源不会被回收。

不同于ExitThread总是“杀死”主调线程,TerminateThread能杀死任何线程,但是,线程无法正确清理,而且不能阻止自己被终止运行。详见《windows核心编程》P149。

 

ExitThread举例:

#include <iostream>
#include <windows.h>
#include <process.h>

using namespace std;
unsigned int last_handle;

unsigned int __stdcall lastFunc(PVOID pm) {
	cout << "hello world hello kitty" << endl;
	Sleep(2000);
	_endthreadex(last_handle);
	cout << "hello world" << endl;
	return 0;
}

int main() {
	last_handle = _beginthreadex(NULL, 0, lastFunc, NULL, 0, NULL);
	Sleep(500);
	
	cout << "to be end..." << endl;

	getchar();
	return 0;
}

运行结果为:


 

线程函数 终止自己。

 

#include <iostream>
#include <windows.h>
#include <process.h>

using namespace std;

unsigned int last_handle;

unsigned int __stdcall lastFunc(PVOID pm) {
	cout << "hello world hello kitty" << endl;

	Sleep(2000);
	cout << "hello world" << endl;
	return 0;
}

int main() {
	last_handle = _beginthreadex(NULL, 0, lastFunc, NULL, 0, NULL);
	_endthreadex(last_handle);

	Sleep(500);
	
	cout << "to be end..." << endl;
	getchar();
	return 0;
}

运行结果如下:

终止运行线程的注意事项
 显示出运行窗口之后,窗口自动消失

在主线程中调用了_endthreadex(last_handle);  会保证该 last_handle 线程完成后, 主线程终止。

比较让人奇怪的是 传入的是子线程的句柄,子线程非但不终止 而且 主线程在等待子线程结束后,终止了自己。

 

_endthreadex函数 只能在调用线程中终止自己。

 

 

 

 

 

你可能感兴趣的:(线程)