1. 程式人生 > >C/C++中退出執行緒的四種解決方法

C/C++中退出執行緒的四種解決方法

退出執行緒可以有四種方法:

1.執行緒函式的return返回(最好這樣):
其中用執行緒函式的return返回, 而終止執行緒是最安全的, 線上程函式return返回後, 會清理函式內申請的類物件, 即呼叫這些物件的解構函式. 然後會自動呼叫 _endthreadex()函式來清理 _beginthreadex(...)函式申請的資源(主要是建立的tiddata物件).

2.呼叫 _endthreadex()函式 或 ExitThread()函式(最好不要):
如果使用這兩種方法退出執行緒, 則不會執行執行緒函式的return語句, 所以就不會呼叫執行緒函式作用域內申請的類物件的解構函式, 會造成記憶體洩露.

剩下兩種是在程式設計中一定要避免的.
3.用同一個程序中的另一個執行緒呼叫 TerminateThread()函式(必須避免);
4.終止該執行緒所在的程序(絕對避免);

但是要說_endthreadex完全沒有用肯定是不對的,_endthreadex並不是一個過時的函式,正確的使用並不會帶來問題。
比如線上程的主函式中,return是_endthreadex的一個良好替代,就像main函式裡面return是exit()或ExitProccess()的良好替代一樣,但是這不表示exit函式沒用。比如執行緒呼叫了一個子函式,如果子函式決定退出執行緒,return是沒用的,_endthreadex即可終結執行緒。

但是這個設計不好,因為可能造成LZ提出的資源洩漏。尤其考慮到後臺執行緒終結後的資源洩漏比主執行緒的資源洩漏更要命(主執行緒退出後,程序就退出了,OS會清理一切資源,無所謂洩露不洩露,而子執行緒退出後主執行緒可能還會執行很久,並且可能有大量的同類型的子執行緒退出,會造成要命的洩露)
良好的設計還是返回執行緒的主函式,讓threadproc來決定是不是要退出,從這個意義上說,_endthreadex沒有必要。微軟也指出,有些程式設計師就是要呼叫exit系列函式(ExitThread,ExitProccess等),沒轍,只好提供了。