我们通常的进程是通过退出主线程来完成, 这里的退出不是指用TerminateThread方法去退出. 而是线程碰到return返回或着执行完整个线程体. 多个线程的程序, 则主线程退出的时候一一去等待其他的线程退出, 然后再退出本身. 怎么样正常的退出进程不是我们要在这里讨论的问题, 有兴趣的话可以参看win32多线程程序设计.
在讨论下面话题之前需要指出的一点. 不要在万不得已的情况下使用强制退出进程.
这里我们重点讨论怎么非正常的退出进程. 先说一下在什么情况下你可能会考虑到这种方式.
你可能去客户现场进行UAT之前的测试, 但是发现系统中某个进程在退出时需要花很长的时间, 如超过1分钟以上. 当然这个问题你之前没有发现, 因为这个问题只有在你的客户那里出现, 在公司的开发机和测试机上退出很快. 因为马上就要进行UAT了没有多少时间了.这种情况下你就可能会考虑到强制退出,暂时去解决这个问题, 等UAT顺利完成后, 你在慢慢的去解决这个问题.
那么你几种选择呢?
exit, TerminateProcess, ExitProcess?
在我们使用这些函数之前, 先看看它们都有什么特点.
exit, 这个函数时c运行时库的函数, 其实除了这个函数外, c运行时库还提供了其他类似的_exit, _cexit, _c_exit. exit这个函数在退出进程前它自动做一些清理工作, 包括文件的Flush, 关闭文件句柄. _exit则是立即退出, 不会做清理工作.
TerminateProcess, ExitProcess: 这个2个方法都是windows运行时库提供的函数, 前者只会去关闭一些对象的句柄然后就退出进程, 而后者则会关闭句柄和通知所有加载进来的DLL.
这样的话我们可以选择顺序可以ExitProcess->exit->TerminateProcess->_exit.
其实上述场景时我在客户现场碰到过, 当时我先选的exit,发现在退出的时候弹出内存不可读错误. 其实这就时在释放资源出错. 后来我就用TerminateProcess, 就没有问题了.
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.