|
发表于 2013-5-8 11:50:17
|
显示全部楼层
广西壮族自治区柳州市
№技术控 发表于 2013-5-4 17:01 
汗 进程我就不会拉我全部身家了
终止线程的执行有4种方法。
(1)线程函数自然退出。当函数执行到return语句返回时,Windows将终止线程的执行。建议使用这种方法终止线程的执行。
(2)使用ExitThread函数来终止线程,原型如下:
void ExitThread( DWORD dwExitCode); // 线程的退出代码
ExitThread函数会中止当前线程的运行,促使系统释放掉所有此线程使用的资源。但是,C/C++资源却不能得到正确地清除。例如,在下面一段代码中,theObject对象的析构函数就不会被调用。
class CMyClass
{
public:
CMyClass() { printf(" Constructor\n"); }
~CMyClass() { printf(" Destructor\n"); }
};
void main()
{ CMyClass theObject;
::ExitThread(0); // ExitThread函数使线程立刻中止,theObject对象的析构函数得不到机会被调用
// 在函数的结尾,编译器会自动添加一些必要的代码,来调用theObject的析构函数
}
运行上面的代码,将会看到程序的输出。
Constructor
一个对象被创建,但是永远也看不到Destructor这个单词出现。theObject这个C++对象没有被正确地销毁,原因是ExitThread函数强制该线程立刻终止,C/C++运行期没有机会执行清除代码。
所以结束线程最好的方法是让线程函数自然返回。如果在上面的代码中删除了对ExitThread的调用,再次运行程序产生的输出结果如下:
Constructor
Destructor
(3)使用TerminateThread函数在一个线程中强制终止另一个线程的执行,原型如下:
BOOL TerminateThread(
HANDLE hThread, // 目标线程句柄
DWORD dwExitCode // 目标线程的退出代码
);
这是一个被强烈建议避免使用的函数,因为一旦执行这个函数,程序无法预测目标线程会在何处被终止,其结果就是目标线程可能根本没有机会来做清除工作,比如,线程中打开的文件和申请的内存都不会被释放。另外,使用TerminateThread函数终止线程的时候,系统不会释放线程使用的堆栈。所以,建议读者在编程的时候尽量让线程自己退出。如果主线程要求某个线程结束,可以通过各种方法通知线程,线程收到通知后自行退出。只有在迫不得已的情况下,才使用TerminateThread函数终止线程。
(4)使用ExitProcess函数结束进程,这时系统会自动结束进程中所有线程的运行。用这种方法相当于对每个线程使用TerminateThread函数,所以也应当避免这种情况。
|
|