C/C++中加入線程的四種處理辦法。本站提示廣大學習愛好者:(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等),沒轍,只好供給了。