线程应当如何正常退出?

先来看这样一段代码:

#include <windows.h>
#include <cstdio>

class T
{
public:
    ~T(){puts(&quot;destruction&quot;);};
};
DWORD WINAPI ThreadProc(LPVOID)
{
    T t;
    ExitThread(0);
}


int main()
{
    CreateThread(NULL, 1024, ThreadProc, NULL, 0, NULL);
    Sleep(1000);
    return 0;
}

这是一个简单的线程调用的例子,为了设置线程的退出码,有的人喜欢调用ExitThread退出线程,但这不是一种好的方式,运行这个程序就会发现,ThreadProc中的局部变量t没有调用析构函数!

很多人没有意识到,ExitThread这个函数有强制关闭线程的意思,强制关闭,就不是正常退出,ExitThread函数后面的代码将不能被执行。而像动态变量的析构函数是在函数花括号结束处被调用的,这些代码是编译器隐式地添加到ExitThread之后的内容。所以,如果直接调用ExitThread,析构函数将被跳过,这在一些程序中将是一个严重的问题。而退出码的设置,也只需要用一个return就行了。上面的代码应该写成这样:

DWORD WINAPI ThreadProc(LPVOID)
{
    T t;
    return 0;
}
类似的函数还有ExitProcess,进程正常退出的情况也不应该使用ExitProcess,原因如上面的ExitThread一样,ExitProcess是强制退出一个进程,析构函数及进程退出时必须的一些运行库清理工作也会因强制退出而不能被执行。正常结束时应当使用return。


你可能感兴趣的:(工作,null,编译器,winapi)