清除:
執行緒終止有兩種情況:
(1)正常終止
;(2)
非正常終止
(1)
正常終止:執行緒主動呼叫pthread_exit或者從執行緒函式中return都將使執行緒正常退出,這是可預見的退出方式;
(2)
非正常終止:執行緒在其他執行緒的干預下,或者由於自身執行出錯(比如訪問非法位址)而退出,這種退出方式是不可預見的。
不論是可預見的執行緒終止還是異常終止,都會存在資源釋放的問題,如何保證執行緒終止時能順利的釋放掉自己所占用的資源,是乙個必須考慮解決的問題。
清除:
從
pthread_cleanup_push
的呼叫點到
pthread_cleanup_pop
之間的程式段
中的終止動作(包括呼叫
pthread_exit()
和異常終止,
不包括return
)都將執行
pthread_cleanup_push()
所指定的清理函式
(注意:
pthread_cleanup_push
和pthread_cleanup_pop
是配對使用的)
#include
void
pthread_cleanup_push(void(*rth)(void*),void *arg)
功能:將清除函式壓入堆疊
rth :
清除函式
arg :
清除函式的引數
#include
void pthread_cleanup_pop(int execute)
功能:將清除函式彈出堆疊
引數:
excute
執行到pthread_cleanup_pop
()時是否在彈出清理函式的同時執行該函式,
excute
的值為:非0
:執行;0:
不執行
例程:部分
void *clean(void *arg)
void *thr_fn1(void *arg)
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return (void *)1;
}
void *thr_fn2(void *arg)
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
pthread_exit((void *)2);
}
部分執行結果:
thread 2 start
thread 2 push complete
cleanup :thread 2 second handler
cleanup :thread 2 first handler
(為什麼先執行cleanup :thread 2 second handler
再執行cleanup :thread 2 first handler?因為:pthread_cleanup_push( (void*)clean,"thread 2 first handler"先執行先被壓入堆疊,而pthread_cleanup_push( (void*)clean,"thread 2 second handler"後執行後被壓入堆疊;而堆疊有「先進後出」的規則);
linux下多執行緒程式設計入門(二)
上一節中,從輸出的數字分布,可以看出是 多執行緒輪流執行的,但是我們並不知道對應數字是哪乙個執行緒輸出的,這一節我們通過學習往執行緒中傳引數 以此區分執行緒。include include include void test void args 傳入的引數是 void 型別 intmain 輸出結果...
Linux系統下的多執行緒程式設計入門二
修改執行緒的屬性 在上一節的例子裡,我們用pthread create函式建立了乙個執行緒,在這個執行緒中,我們使用了預設引數,即將該函式的第二個引數設為null。的確,對大多數程式來說,使用預設屬性就夠了,但我們還是有必要來了解一下執行緒的有關屬性。關於執行緒的繫結,牽涉到另外乙個概念 輕程序 l...
Linux下多執行緒的執行緒保護
目錄 一 開發環境 二 互斥鎖 系統 ubuntu16.04 執行緒庫 pthread 語言 c c linux下的執行緒保護,最常用的是互斥鎖 條件變數 訊號量和讀寫鎖。先來試一下互斥鎖吧 多執行緒之間可能需要互斥的訪問一些全域性變數,這就需要互斥的來訪問,這些需要共享訪問的字段被稱作是臨界資源,...