2015-05-21 69 views
1

VS2013,C++ 我剛剛發佈dll應用程序。 dll app函數之一由_beginthread運行線程。 在正常的軟件流程中,我使用互斥鎖和控制線程。在從主應用程序註銷DLL之前,我等待線程終止並關閉處理程序。C++子線程終止在main()父線程退出?

但是,有一種情況下,主應用程序可以正確的方式關閉沒有釋放資源,我的意思是不等待子線程終止和沒有處理程序關閉。

主應用程序退出是否有風險?如果退出後再次運行應用程序和線程,是否有任何風險? 操作系統有沒有風險?主線路退出後,所有線程都終止了嗎?

我知道這是「髒」的解決方案,但由於某種原因,我無法改變這種情況。

非常感謝您的建議。

回答

1

根據Raymond Chen - 在Windows系統中 - 如果主線程終止,您的應用程序掛起而所有線程結束。這意味着,您的解決方案不會工作,您的線程將凍結您的應用程序在關閉狀態。即使你的線程在退出時被強制終止,它也不會被初始化,並且 - 因爲我們在這裏討論的是MFC線程 - 它會導致你的應用程序泄露資源,所以請漂亮請不要這樣做!

+0

有趣! 「應用程序掛起而所有線程結束」並不意味着它永遠掛起。我假設,線程也被運行時終止,不是嗎? –

+0

@ValentinHeinitz我強烈建議閱讀關於該主題的鏈接文章......它闡明瞭很多我沒有時間來解釋自己的事情。即使運行時通過調用'TerminateThread()'(或任何其他強制手段)來終止線程,線程分配的所有資源也會被泄漏,所以它仍然是一個不好的解決方案。 – mg30rg

1

主要應用程序退出是否有任何風險?

是的!由於線程可以啓動一致性敏感的進程。

如果我退出後再次運行應用程序和線程,是否有任何風險?

是的!可能是以前的關機破壞了數據結構,現在你甚至無法正確加載數據

是否有任何操作系統風險?

這取決於您的業務。可能是您創建軟磁盤優化軟件,並且您正在緊急關機時移動羣集?

所有線程在主退出後終止?

是的!您需要預見特殊的「連接」代碼,以等待線程的完成。

1

我會說,行爲是不確定的。當應用程序被終止而沒有機會清理時,可能會發生太多事情。 這SO question可能會提供一些想法。

MS article describes TerminateThread功能,並且還列出了意外終止的線程(這可能是發生在調用exit)的一些含義:

  • 如果目標線程擁有臨界區,臨界區 將不會被釋放。
  • 如果目標線程正在從堆中分配內存,堆鎖將不會被釋放。
  • 如果目標線程在終止時正在執行某些kernel32調用,則線程進程的kernel32狀態可能是 不一致。
  • 如果目標線程正在操作共享DLL的全局狀態,則DLL的狀態可能會被破壞,從而影響DLL的其他用戶 。

所以看起來就像是有風險的,即使是OS

KERNEL32狀態的線程的進程可能會不一致

+0

我知道從外部終止線程的一些未列出的後果:如果它擁有任何Windows句柄(文件或命名管道句柄,內核對象,共享內存或甚至可能性較小的GUI句柄)的所有權,那些手柄可能會「泄漏」(仍未釋放)。如果它有任何鎖定/發信號的同步對象(一個已命名的互斥體或事件,一個信號量等),它可能保持鎖定狀態,可能會阻止稍後的實例運行。如果它處於延遲文件寫入的中間,可能會使文件處於不一致的狀態。它甚至可能爲了神而傷害頁面文件! – mg30rg