線程退出前的資源釋放問題

線程退出前的資源釋放問題

類似於進程的atexit()函數,線程在退出前也可以執行用戶顯示定義的一些函數。無論是可預見的線程終止還是異常終止,都會存在資源釋放的問題,在不考慮因爲運行出錯而退出的情況下,如何保證線程終止時能順利的釋放掉自己所佔用的資源,特別是鎖資源。


資源獨佔鎖的使用:

線程爲了訪問臨界資源而爲其加上鎖,但在訪問過程中被外界取消,如果線程處於響應取消狀態,且採用異步方式響應,或者是在打開獨佔鎖以前的運行路徑上存在取消點,在該臨界資源將永遠處於鎖定狀態得不到釋放。外界取消操作是不可遇見的,因此需要一個機制來化簡用於資源釋放的編程。


函數pthread_clean_push()/pthread_cleanp_pop()用於自動釋放資源

pthread_clean_push(),pthread_cleanp_pop()採用先入後出的棧結構來管理

void pthread_clean_push(void (*routine)(void*),void *arg);
void pthread_cleanp_pop(int execute);

//參數void (*routine)(void*)在調用pthread_clean_push()時壓入清理函數棧
//execute表示執行到pthread_cleanp_pop()時,
//是否在彈出清理函數的同時執行函數,爲0表示不執行;非0爲執行。
//這個參數並不影響異常終止時清理函數的執行

觸發routine的3種情況:

  1. pthread_exit( );
  2. pthread_cancel( );
  3. cleanup_pop參數1;

下面這個例子展示了上面兩個函數的使用,在此程序中,子線程while(1)死循環,而在主線程中使用pthread_cancel()取消線程

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
我們用了pthread_clean_push(),pthread_cleanp_pop()兩個函數,當線程被終止時,可以出棧執行我們之前入棧的函數,進行內存釋放

發佈了78 篇原創文章 · 獲贊 15 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章