2012-01-05 101 views

回答

9

兩個原因,我想起:pthread_exit

  1. 允許您從調用堆棧任何深度退出線程。

  2. Must be called on the main thread if the TLS keys for the main thread are to have their free functions called.這裏還有:「已經推尚未殺出以相反的順序被彈出,他們推,然後所有執行取消清理處理程序之後的任何取消清理處理程序已經執行,如果線程具有任何線程特定的數據,適當的析構函數將以未指定的順序調用......當第一次調用main()的線程之外的線程從啓動例程返回時,隱式調用pthread_exit()被用來創建它,函數的返回值作爲線程的退出狀態。「

+1

不同意。在這兩種情況下,pthread_exit仍然可以被return替換。 – 2012-01-05 22:58:50

+3

對於#1,是的,但這樣做可能不方便。對於#2,它不能。看到我發佈的鏈接。我最近在真實世界中遇到了這個問題。 – 2012-01-05 23:00:57

+4

@Mengfei:如果你在'pthread_create()'啓動的函數中,'pthread_exit()'只能被'return'替換。如果線程在函數調用堆棧中更深一些,那麼'return'根本不會做同樣的事情。 – 2012-01-06 05:18:58

3

如果你要調用了pthread_exit複製的接口,那麼你也應該叫exit()複製的界面,因爲你可以在任意點退出程序。當您遇到某種您無法繼續的錯誤情況時,您可能需要致電pthread_exit()。或者,您也可以在線索內找到您要查找的任何值。

至於它是真實存在的,根據documentation

當比線程以外的線程中的main()首次調用返回從啓動程序到了pthread_exit隱式調用()由這是用來創建它。該函數的返回值用作線程的退出狀態。

所以,如果你從線程做了return <some pointer>,或者只是到了最後,pthread_exit()就會被調用。從main()退出也是一樣,如果你return 0你實際上打電話給exit(0)。函數必須存在,否則內核將無法確定線程是否退出。

相關問題