2013-06-05 47 views
4

在我的計劃,我處理新主題與是否需要分離pthread以防止內存泄漏?

pthread_t thread; 
pthread_create(&thread, NULL, 
      c->someFunction, (void *) fd); //where fd is ID of the thread 

的問題是很簡單 - 如果我只是讓someFunction完成,是它需要再C++到例如某事物join或其他任何東西,prevenet memory leaks或內存是否自動釋放??

回答

7

opengroup page for pthread_join

的在pthread_join()函數提供了一種簡單的機制,允許一個應用 等待一個線程終止。在線程 終止之後,應用程序可以選擇清理線程使用的資源 。例如,在pthread_join()返回後, 可以回收任何應用程序提供的堆棧存儲。

的在pthread_join()或pthread_detach()函數最終應要求與該detachstate屬性被 集創建到PTHREAD_CREATE_JOINABLE所以與 線程相關聯的存儲可以被回收的每個線程 。

並從man page of pthread_join

未加入具有螺紋即可連接(即,一個不 分離的),親 duces「殭屍線程」。避免這樣做,因爲每個殭屍線程都會消耗一些系統資源,並且當有足夠的殭屍線程累積時,將不再有可能創建新線程(或進程)的可能性爲 。

waitpid沒有pthreads類似物(-1,& status,0),即「加入任何ter- minated線程」。

如果您認爲您需要此功能,您可能需要重新考慮您的應用程序設計。

如果你這樣做pthread_detach

的pthread_detach()函數應該指示執行 是存儲該線程的線程可以被回收時,該線程 終止

如果您不要detachjoin a joinable線程,它會導致資源浪費

+0

刪除我的答案,你的更好。 – BoBTFish

+0

因此,當我想退出應用程序時,是否需要遍歷創建線程和'deatch'的'vector'(最終在完成其工作後「分離」某個線程)?我問,因爲我不確定是否理解'join'和'detach'之間的區別。但在我看來,我可以肯定,在我打電話之後,「detach」會終止線程,對吧? – Dworza

+4

如果您將線程分離,線程完成工作時線程的資源將被釋放。Join用於連接到一個線程(如果你在main中的某個線程上進行連接,main將不會執行直到線程被終止並且其資源被釋放)。 'join'和'detach'用於不同的目的。但它們都釋放資源.Detach不是用於終止線程,線程將自行終止.Detached意味着沒有人正在等待線程終止。 (就像在加入,有人正在等待線程終止,因此它可以加入 –

相關問題