linux多線程之線程資源的釋放
一般來(lái)說(shuō),對(duì)一段運(yùn)行代碼進(jìn)行加鎖然后解鎖,如下所示:
pthread_mutex_lock(&mutex);
//運(yùn)行代碼;
pthread_mutex_unlock(&mutex);
如果在運(yùn)行代碼這塊發(fā)生錯(cuò)誤,有異常,導(dǎo)致這個(gè)線程異常退出,那么怎么辦,pthread_unlock沒(méi)有得到調(diào)用,那么這個(gè)鎖資源沒(méi)有解鎖??梢杂孟旅娴姆椒ㄐ薷摹?/p>
pthread_cleanup_push(pthread_mutex_unlock, (void *) &mutex);
pthread_mutex_lock(&mutex);
/* do some work */
pthread_mutex_unlock(&mutex);
pthread_cleanup_pop(0);
這樣假如運(yùn)行代碼發(fā)生錯(cuò)誤時(shí)沒(méi)有調(diào)用到解鎖,pthread_cleanup_up會(huì)自動(dòng)來(lái)調(diào)用,參數(shù)為0表示不執(zhí)行push進(jìn)來(lái)的函數(shù)。
但是如果是異常錯(cuò)誤的話,這個(gè)參數(shù)并不影響異常終止時(shí)清理函數(shù)的執(zhí)行。
必須要注意的是,如果線程處于PTHREAD_CANCEL_ASYNCHRONOUS狀態(tài),上述代碼段就有可能出錯(cuò),因?yàn)镃ANCEL事件有可能在pthread_cleanup_push()和pthread_mutex_lock()之間發(fā)生,或者在pthread_mutex_unlock()和pthread_cleanup_pop()之間發(fā)生,從而導(dǎo)致清理函數(shù)unlock一個(gè)并沒(méi)有加鎖的mutex變量,造成錯(cuò)誤。因此,在使用清理函數(shù)的時(shí)候,都應(yīng)該暫時(shí)設(shè)置成PTHREAD_CANCEL_DEFERRED模式。為此,POSIX的Linux實(shí)現(xiàn)中還提供了一對(duì)不保證可移植的pthread_cleanup_push_defer_np()/pthread_cleanup_pop_defer_np()擴(kuò)展函數(shù),功能與以下代碼段相當(dāng):
{ int oldtype;
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
pthread_cleanup_push(routine, arg);
...
pthread_cleanup_pop(execute);
pthread_setcanceltype(oldtype, NULL);
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
設(shè)置退出類(lèi)型pthread_setcanceltype
#include <pthread.h>
int pthread_setcanceltype(int type, int *oldtype);
返回值:函數(shù)成功返回0。任何其他返回值都表示錯(cuò)誤。
將線程退出類(lèi)型設(shè)置為延遲類(lèi)型或異步類(lèi)型。參數(shù)type的取值為PTHREAD_CANCEL_DEFERRED或PTHREAD_CANCEL_ASYNCHRONOUS。
當(dāng)一個(gè)線程被創(chuàng)建后,缺省值是延遲類(lèi)型。在異步方式下,線程可以在執(zhí)行的任何時(shí)候被退出。
【編輯推薦】