避免使用不當pthread_create函式造成記憶體洩露
pthread_create使用不當會造成記憶體洩漏,對於記憶體不大的開發板會造成嚴重後果。
問題:dlna主程式中使用pthread_create建立兩個執行緒scan和inotify,造成記憶體佔用率過大,導致crash。
產生根源:pthread_create預設建立的執行緒是非detached的。
預防方式:要麼建立detached的執行緒,要麼在非detached執行緒結束之前detached,或者在主程式中join。
執行緒的分離狀態決定執行緒以什麼樣的方式來終止自己。執行緒的預設屬性是非分離狀態,這種情況下,主程式等待新程式結束,只有當pthread_join函式返回時,新程式才終止,才會釋放所佔有系統資源。而分離執行緒則不同,不會被主程式等待,執行結束程式也就終止,立即釋放系統資源。pthread_create建立的程式預設是分配8M左右的記憶體空間,該引數可調整,使用不當回造成改記憶體空間一直被佔用,直至主程式結束才一起釋放。
避免記憶體洩露的幾種使用方法:
方法一、建立detached的執行緒
-
void run() {
-
return;
-
}
-
-
int main(){
-
pthread_t thread;
-
pthread_attr_t attr;
-
pthread_attr_init( &attr );
-
pthread_attr_setdetachstate(&attr,1);
-
pthread_create(&thread, &attr, run, 0);
-
- //......
-
return 0;
- }
方法二、執行緒結束之前detached
-
void run() {
-
pthread_detach(pthread_self());
-
}
-
-
int main(){
- pthread_t thread;
-
pthread_create(&thread, NULL, run, 0);
-
- //......
-
return 0;
- }
方法三、主執行緒使用pthread_join
-
void run() {
-
return;
-
}
-
-
int main(){
- pthread_t thread;
- pthread_create(&thread, NULL, run, 0);
- //......
- pthread_join(thread,NULL);
-
return 0;
- }
相關文章
- Android中使用Handler造成記憶體洩露的分析和解決Android記憶體洩露
- SHBrowseForFolder 記憶體洩露記憶體洩露
- Microsoft.Extensions.DependencyInjection中的Transient依賴注入關係,使用不當會造成記憶體洩漏ROS依賴注入記憶體
- [譯] RxJS: 避免 takeUntil 造成的洩露風險JS
- 記憶體溢位和記憶體洩露記憶體溢位記憶體洩露
- Lowmemorykiller記憶體洩露分析記憶體洩露
- Java面試題:細數ThreadLocal大坑,記憶體洩露本可避免Java面試題thread記憶體洩露
- 使用 mtrace 分析 “記憶體洩露”記憶體洩露
- 實戰Go記憶體洩露Go記憶體洩露
- Android 記憶體洩露詳解Android記憶體洩露
- 造成記憶體洩漏的操作有哪些?記憶體
- 記憶體洩漏-原因、避免和定位記憶體
- Linux記憶體洩露案例分析和記憶體管理分享Linux記憶體洩露
- ArkTS 的記憶體快照與記憶體洩露除錯記憶體洩露除錯
- nodejs爬蟲記憶體洩露排查NodeJS爬蟲記憶體洩露
- Pprof定位Go程式記憶體洩露Go記憶體洩露
- 造成記憶體洩漏的異常處理記憶體
- 如何避免JavaScript中的記憶體洩漏?JavaScript記憶體
- win10驅動記憶體洩露如何解決_win10記憶體洩露處理方法Win10記憶體洩露
- 記一次 redis 事件註冊不當導致的記憶體洩露Redis事件記憶體洩露
- 避免PHP-FPM記憶體洩漏導致記憶體耗盡PHP記憶體
- android Handler導致的記憶體洩露Android記憶體洩露
- netty 堆外記憶體洩露排查盛宴Netty記憶體洩露
- 乾貨分享:淺談記憶體洩露記憶體洩露
- 解決git記憶體洩露問題Git記憶體洩露
- Spring Boot heapdump洩露記憶體分析方法Spring Boot記憶體
- 線上記憶體洩露定位--memleak工具記憶體洩露
- java中如何檢視記憶體洩露Java記憶體洩露
- Executors使用不當引起的記憶體溢位記憶體溢位
- Android中使用Handler為何造成記憶體洩漏?Android記憶體
- 記一次"記憶體洩露"排查過程記憶體洩露
- [譯] Swift:通過示例避免記憶體洩漏Swift記憶體
- 簡單的記憶體“洩露”和“溢位”記憶體
- JAVA記憶體洩露的原因及解決Java記憶體洩露
- 一個 Vue 頁面的記憶體洩露分析Vue記憶體洩露
- 一個Vue頁面的記憶體洩露分析Vue記憶體洩露
- C程式記憶體洩露檢測工具——ValgrindC程式記憶體洩露
- Android效能最佳化之記憶體洩露Android記憶體洩露