2014-03-27 51 views
2

在維護期間,我看到項目代碼(在linux上的c/c++中)在某些不可恢復錯誤的情況下調用libcexit函數。但是,此進程終止調用跨多個線程使用(每次遇到不可恢復的情況時)。現在 -進程退出和對線程的影響

  • 可以從主線程以外的線程調用進程exit而沒有任何副作用。
  • 每當調用exit(在主線程或任何其他線程中),它是否保證線程的優雅退出。

據我所知,標準(手冊頁)是閉口不談它,而要做到最好的辦法是,啓動所有線程的正常終止,並使用通知機制,main線程必須通知的正常終止。但是,由於它是一個正在維護中的項目,因此要在更改之前檢查當前的行爲是否正確。

問題我面對的是,我可以看到隨機崩潰,其中一個線程正在調用執行的正常進程exit之下。

+0

'隨機崩潰' - 有什麼症狀,會發生什麼,不應該發生? –

回答

1

對於第一個問題,當您調用exit(來自任何線程,主或子)時,該進程立即退出。

對於第二個問題,請參閱上面的答案。總之,沒有。線程不會「優雅地」退出(反正從應用程序的角度來看)。

+0

我同意你的看法,但在退出的過程中,如果另一個線程正在執行,會不會導致崩潰?在內核模式下退出,確保其他線程被阻止? –

+0

@kumar_m_kiran我不認爲它指定線程將按特定順序被殺死,所以我認爲不可能發生奇怪的事情。如果您可以複製崩潰,那麼我建議您在調試器中運行您的應用程序以查看崩潰發生的時間和地點。 –

+1

我會認爲這種「崩潰」是罕見的。在釋放進程所擁有的資源之前,操作系統確實停止了所有核心上的所有線程,因此很難想出在進程終止期間可能引發任何類型故障的情況。 –