1.1 主线程进入点函数返回 始终都应该这样来设计应用程序

时间:2022-01-30 04:46:54

1 进程终止的要领:

<1>主线程的进入点函数返回(最好使用这种要领)

<2>进程中的一个线程挪用ExitProcesss函数(应该制止使用这样的要领)。 

<3>还有一个进程中的线程挪用TerminateProcess函数(应该制止使用这样的要领)。 

<4>进程中的全部线程自行终止执行(这样的情况差点儿从未产生)。

1.1  主线程进入点函数返回

始终都应该这样来设计应用措施。即仅仅有当主线程的进入点函数返回时,它的进程才终止执行。这是保证全部线程资源可以得到正确断根的独一步伐。

<1>  C++东西将可以使用它们的析构函数得以释放

<2> 操纵系统可以正确的释放该线程使用的仓库内存

<3> 系统将进程的退出代码设置为进入点函数的返回值

<4> 系统将内查东西的计数值减去1

1.2 挪用ExitProcess函数

voidExitProcess(uExitCode)

跟主线程的进入点函数返回对比,它就不那么安适,不能保证资源被清理。

通过挪用ExitProcess函数。C++/C执行期启动代码可以确保主线程从它的进入点函数返回时,进程便终止执行,而无论进程中是否还有其它线程在执行。

假设在进入点函数中挪用ExitThread。那么主线程就会遏制执行,可是假设进程中假设还有其它线程的话。进程便不会终止。

ExitProcess以及ExitThread能保证操纵系统资源在函数挪用时被断根,可是不能保证C/C++执行时资源被正确的断根。所以不妨事不要挪用这些资源。

在前面也介绍过当主线程的进入点函数返回的时候。C/C++执行时会挪用执行时的exit函数。exit函数会完毕以下操纵

<1>挪用_onexit函数的挪用而注冊的人岂论什么函数

<2>为全部的全局和静态的C++东西挪用析构函数

<3>挪用系统的ExitProcess函数。将nMainRetVal通报给它。

使得操纵系统可以勾销进程并设置它的exit代码。

1.3 挪用TerminateProcess 函数

BOOL TerminateProcess(HANDLE hProcess,UINTnExitCode)

这个函数通知进程内全部线程终止。当全部线程终止时。进程也会终止了,可是它不会报告进程内相关联的DLL这个进程将要被终止。它做的工作:

<1>全部打开的句柄被*

<2>全部的线程会被终止

<3>进程东西的状态变为终止的,满足全部期待进程结束的线程

<4>进程中全部线程东西的状态变为终止。满足全部期待线程结束的线程

<5>进程的终止状态由STILL_ACTIVE变为了进程的返回代码

这个函数是异步的。它报告操纵系统,你要终止某个进程。可是当函数返回的时候,你无法保证进程是否已经被杀死。假设想要确切知道进程是否被杀死,能够使用WaitForSingleObject函数。

2   进程终止时的情况

<1>进程中全部残剩线程将被终止

<2>进程中指定的用户东西,GDI东西被释放。内查东西被*

<3>内查东西的状态编程收到通知的状态

<4>进程的退出代码由STILL_ACTIVE 变为ExitProcess或者TerminateProcess通报的的退出代码

<5>进程内查东西计数减去1

能够通过函数 BOOLGetExitCodeProcess(HANDLE handle,LPDWORD lpExitCode)来查找进程的退出代码。假设代码是STILL_ACTIVE暗示的是进程还没终止。假设不是这个,就说明进程已经被终止。

3   子进程

措施中要实现一段成果一配合拥有3种要领:

<1>挪用函数

<2>斥地新线程

<3>斥地新进程

3.1 挪用函数

挪用函数时很常见的。可是它的错误谬误是由于在同一个线程中,所以必需期待此函数运行完成,,才具运行后面的代码

3.2 斥地新线程

这样可以在新线程运行的时候,同一时候运行其它线程的代码,可是这种错误谬误是差别线程之间必要交流数据时候。会孕育产生同步的问题。

3.3 斥地子进程

这样有点是既能够掩护数据。能够同步运行,也能够期待新进程运行完成再去运行其它进程的代码。错误谬误是斥地新进程,会造成地点空间的浪费。