1.进程可以通过以下四种方法终止:
主线程的入口点函数返回(强烈保举的方法)
进程中的一个线程挪用ExitProcess函数(制止这种方法)
另一个进程中的线程挪用TerminateProcess函数(制止这种方法)
进程中的所有线程都“自然死亡”(这种情况几乎从来都不会产生)
2.应该保证只有在主线程的入口点函数返回之后,这个应用措施的进程才终止,只有这样才华保证主线程的所有资源都被正确清理。让主线程的入口点函数返回,可以保证以下操纵会被执行:
该线程创建的任何C++东西都将由这些东西的析构函数正确销毁。
操纵系统将正确释放线程栈使用的内存。
系统将线程的退出代码(在进程内查东西中维护)设为入口点函数的返回值。
系统递减进程内查东西的使用计数。
3.ExitProcess函数将终止进程,并设置退出代码,没有返回值,而且之后的代码永远不会被执行(东西的析构函数也无法被挪用)。
4.当主线程的入口点函数(WinMain,main)返回时,会返回到C/C++运行库的启动代码,后者将正确清理进程使用的全部C运行时资源。释放了C运行时资源之后,C运行时启动代码将显示挪用ExitProcess,并将入口点函数返回的值传给它。这便解释了为什么只需从主线程的入口点函数返回,就会终止整个进程。注意,进程中运行的其他任何线程城市随进程一起终止。
5.从操纵系统的角度出发,一个进程在其所有线程都终止之后才会终止时正确的。但是C/C++运行库的计谋是:不管进程中是否还有其他线程在运行,只要主线程从它的入口点函数返回,C/C++库就会挪用ExitProcess来终止进程。但是如果入口点函数中挪用的是ExitThread而不是ExitProcess或入口点函数直接返回,应用措施的主线程将遏制执行,但只要进程中还有其他线程在运行,进程就不会终止。
6.任何线程都可以挪用TerminateProcess来终止另一个进程或者它本身的进程。只有在无法通过其他要领来强制进程退出时才用。而且被终止的进程得不到本身要被终止的通知,,也不能阻止本身被强行终止。
7.一旦进程终止,不管是如何终止的,系统会保证不留它的任何部分。绝对没有任何步伐知道哪个进程是否运行过。进程在终止后绝对不会泄漏任何对象(内存会释放,文件会被*,内查东西计数会递减)。
8.TerminateProcess函数是异步的,函数返回时系统并不能保证进程已经被强行终止了。
9.如果一个进程中的所有线程都终止了(它们都挪用了ExitThread或TerminateThread来终止了),操纵系统就认为没有任何理由再连结进程的地点空间,就会终止这个进程,进程的退出代码会被设为最后一个终止的阿谁线程的退出代码。
10.一个进程终止时,系统会依次执行以下操纵:
终止进程中遗留的任何线程
释放进程分配的所有用户东西和GDI东西,*所有内查东西(除非其他进程也打开了)
进程的退出代码从STILL_ACTIVE变为通报给ExitProcess或TerminateProcess函数的代码。
进程内查东西的状态酿成已触发状态,这就是为什么系统中的其他线程可以挂起它们本身,直至另一个进程终止运行。
进程内查东西的使用计数递减1。