我們通常的進程是通過退出主線程來完成, 這裡的退出不是指用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, 就沒有問題了.