避免使用不當pthread_create函式造成記憶體洩露

wuruixn發表於2020-04-07

pthread_create使用不當會造成記憶體洩漏,對於記憶體不大的開發板會造成嚴重後果。

問題:dlna主程式中使用pthread_create建立兩個執行緒scan和inotify,造成記憶體佔用率過大,導致crash。

產生根源:pthread_create預設建立的執行緒是非detached的。

預防方式:要麼建立detached的執行緒,要麼在非detached執行緒結束之前detached,或者在主程式中join。

執行緒的分離狀態決定執行緒以什麼樣的方式來終止自己。執行緒的預設屬性是非分離狀態,這種情況下,主程式等待新程式結束,只有當pthread_join函式返回時,新程式才終止,才會釋放所佔有系統資源。而分離執行緒則不同,不會被主程式等待,執行結束程式也就終止,立即釋放系統資源。pthread_create建立的程式預設是分配8M左右的記憶體空間,該引數可調整,使用不當回造成改記憶體空間一直被佔用,直至主程式結束才一起釋放。


避免記憶體洩露的幾種使用方法:

方法一、建立detached的執行緒
  1. void run() { 
  2.     return;
  3. } 
  4.                                                                                                        
  5. int main(){ 
  6.     pthread_t thread; 
  7.     pthread_attr_t attr; 
  8.     pthread_attr_init( &attr ); 
  9.     pthread_attr_setdetachstate(&attr,1); 
  10.     pthread_create(&thread, &attr, run, 0); 
  11.           
  12.     //...... 
  13.     return 0; 
  14. }

方法二、執行緒結束之前detached
  1. void run() { 
  2.     pthread_detach(pthread_self()); 
  3. } 
  4.                                                                                                        
  5. int main(){ 
  6.     pthread_t thread;  
  7.     pthread_create(&thread, NULL, run, 0); 
  8.               
  9.     //...... 
  10.     return 0; 
  11. }

方法三、主執行緒使用pthread_join
  1. void run() { 
  2.     return;
  3. } 
  4.                                                                                                        
  5. int main(){ 
  6.     pthread_t thread; 
  7.     pthread_create(&thread, NULL, run, 0);  
  8.                                        
  9.     //...... 
  10.     pthread_join(thread,NULL);
  11.     return 0; 
  12. }
其實在linux應用程式中,嘗試了上述所有的方法,都並沒有起到減少記憶體資源一直被佔用的效果,最後迫不得已採用fork方式取代pthread_create方式才有減少記憶體資源佔用的效果。

相關文章