2016-06-29 67 views
3

正常情況下,當main()退出時,所有線程都被終止。 pthread_exit(3)在主線程退出後,C++ 11線程爲分離線程提供了一種繼續的方式嗎?

要允許其他線程繼續執行,主線程應該通過調用pthread_exit()而不是exit(3)來終止。

是否有等效的C++ 11 API調用?像std::this_thread::exit(0)

+0

可能是你應該找的[這樣的事情](http://stackoverflow.com/questions/3095566/linux-daemonize)(不便攜式,我知道)。 –

+0

爲什麼你想要你的線程在主線程退出後繼續運行?你能等待他們先完成嗎? – Dylon

+1

@Dylon說實話,我希望標準說這是不允許的。使我工作更簡單。 –

回答

0

歷史上,main()函數是特殊的 - 它代表了應用程序的生命週期。 C++ 11不會改變這一點。

main函數返回時,程序將清除並終止。這是硬編碼到C運行時。

阻止main正常重新調整的任何事情都可以正常工作(但沒有可移植的終止線程的方式)。

解決方法您的案例可能只是永遠阻止主線程,或者重新使用它來做一些監控/內務處理。

0

頁1121 Working Draft, Standard for Programming Language C++從2012-01-16似乎指出,一旦主線程退出,它的分離線程將被清理,以及(除非我誤解了它):

無效分離();

需要:joinable()爲true。

影響:由*表示的線程在沒有調用線程阻塞的情況下繼續執行。當detach()返回時,*不再代表可能繼續執行的線程。當以前由*表示的線程結束執行時,實現應釋放任何擁有的資源。

後續條件:get_id()== id()。

拋出:需要異常時的system_error(30.2.2)。

錯誤條件

- no_such_process - 如果線程是無效的。

- invalid_argument - 如果線程不可連接。

+4

他們沒有「清理」,他們只是停止存在。如果他們訪問從main返回的主線程和實際退出的進程(例如全局析構函數運行時)之間的任何全局對象,則可能會出現未定義的行爲。你所引用的關於_「執行應該釋放任何擁有的資源」的表述是關於什麼時候分離的線程退出,但是從'main'返回不會導致這種情況發生,分離的線程仍在運行。 –