2011-01-12 166 views
20

我正在使用調用beginthreadex,endthreadex調用Visual Studio C++中的一些多線程編程。當父線程終止時子線程退出

我創建了一個子線程thread1。子線程運行在一個永不退出的函數上,因爲它有一個無限循環。現在,如果父線程以錯誤終止或成功完成,子線程是否也會退出?我的疑問是 - 即使在主程序退出後,是否還存在子線程仍然存在的情況?

對於linux應該如何應對?

+1

這是一個密切相關的問題:http://stackoverflow.com/questions/2197699/is-it-necessary-to-explicitly-stop-all-threads-prior-to-exiting-a-win32-applicati – sharptooth 2011-01-12 08:28:11

+0

The帖子有衝突的答案。 – excray 2011-01-12 09:41:29

+0

@ user97642從你的角度來看,有什麼衝突?所有的答案似乎都是相似的。 – 2011-01-12 10:20:57

回答

31

線程之間沒有父/子關係。如果線程A創建線程B,然後線程A終止,則線程B將繼續執行。

此例外是當主線程(即,運行main()函數的線程)終止時。發生這種情況時,進程終止,所有其他線程停止。

7

由於C和C++ mandate that returning from the main function kills all running threads,是的,該過程應該消失。由於這種行爲是由運行時完成的,所以在Linux上情況應該是一樣的。

+0

您提供的鏈接沒有提及*殺死*(!)所有線程的語言要求。它僅引用了從main返回等價於調用exit()的要求。 – 2016-07-13 08:22:17

2

只要您的進程死掉,所有的資源都被釋放(內存,文件和線程)

做到這一點,正確的方法:當你打電話beginthread,保持返回的句柄父線程,在離開程序之前調用WaitForObject(我們加入父線程與子線程)。

父線程將阻塞,直到子線程完成。如果你的子線程有無限循環,你可以定義一個「中斷點」,並檢查你是否應該離開。例如,使用一個共享的布爾變量。請檢查Interrupt Politely以獲取更多信息。