自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

linux多線程之線程資源的釋放

運(yùn)維 系統(tǒng)運(yùn)維
如果在運(yùn)行代碼這塊發(fā)生錯(cuò)誤,有異常,導(dǎo)致這個(gè)線程異常退出,那么怎么辦,pthread_unlock沒(méi)有得到調(diào)用,那么這個(gè)鎖資源沒(méi)有解鎖??梢杂孟旅娴姆椒ㄐ薷?。

一般來(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í)候被退出。
 

【編輯推薦】

  1. Linux多線程同步之命名管道
  2. Linux多線程同步之消息隊(duì)列
  3. linux定時(shí)器的使用
責(zé)任編輯:趙寧寧 來(lái)源: chinaitlab
相關(guān)推薦

2021-12-26 18:22:30

Java線程多線程

2010-03-16 17:16:38

Java多線程

2021-12-28 09:10:55

Java線程狀態(tài)

2021-12-14 08:28:08

Java多線程線程

2011-06-22 16:08:40

Qt 多線程 事件循環(huán)

2021-02-25 15:58:46

C++線程編程開(kāi)發(fā)技術(shù)

2021-03-05 07:38:52

C++線程編程開(kāi)發(fā)技術(shù)

2010-01-21 11:27:30

linux多線程機(jī)制線程同步

2011-06-22 16:02:37

Qt 多線程 重入

2013-06-07 16:30:08

iOS多線程iOS開(kāi)發(fā)NSThread

2020-11-12 18:08:05

JavaLinux多線程

2009-06-17 11:23:00

Java多線程

2017-05-27 20:59:30

Java多線程synchronize

2009-03-12 10:52:43

Java線程多線程

2013-12-02 17:33:20

Linux進(jìn)程多線程

2017-03-08 16:25:54

Linux多線程函數(shù)

2017-05-31 14:03:07

Java多線程內(nèi)置鎖與顯示鎖

2017-05-08 11:46:15

Java多線程

2023-06-16 08:36:25

多線程編程數(shù)據(jù)競(jìng)爭(zhēng)

2021-06-11 11:28:22

多線程fork單線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)