偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

一般來說,對一段運行代碼進(jìn)行加鎖然后解鎖,如下所示:

pthread_mutex_lock(&mutex);

//運行代碼;

pthread_mutex_unlock(&mutex);

如果在運行代碼這塊發(fā)生錯誤,有異常,導(dǎo)致這個線程異常退出,那么怎么辦,pthread_unlock沒有得到調(diào)用,那么這個鎖資源沒有解鎖。可以用下面的方法修改。

pthread_cleanup_push(pthread_mutex_unlock, (void *) &mutex);

pthread_mutex_lock(&mutex);

/* do some work */

pthread_mutex_unlock(&mutex);

pthread_cleanup_pop(0);

這樣假如運行代碼發(fā)生錯誤時沒有調(diào)用到解鎖,pthread_cleanup_up會自動來調(diào)用,參數(shù)為0表示不執(zhí)行push進(jìn)來的函數(shù)。

但是如果是異常錯誤的話,這個參數(shù)并不影響異常終止時清理函數(shù)的執(zhí)行。

必須要注意的是,如果線程處于PTHREAD_CANCEL_ASYNCHRONOUS狀態(tài),上述代碼段就有可能出錯,因為CANCEL事件有可能在pthread_cleanup_push()和pthread_mutex_lock()之間發(fā)生,或者在pthread_mutex_unlock()和pthread_cleanup_pop()之間發(fā)生,從而導(dǎo)致清理函數(shù)unlock一個并沒有加鎖的mutex變量,造成錯誤。因此,在使用清理函數(shù)的時候,都應(yīng)該暫時設(shè)置成PTHREAD_CANCEL_DEFERRED模式。為此,POSIX的Linux實現(xiàn)中還提供了一對不保證可移植的pthread_cleanup_push_defer_np()/pthread_cleanup_pop_defer_np()擴展函數(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è)置退出類型pthread_setcanceltype

#include <pthread.h>

int pthread_setcanceltype(int type, int *oldtype);

返回值:函數(shù)成功返回0。任何其他返回值都表示錯誤。

將線程退出類型設(shè)置為延遲類型或異步類型。參數(shù)type的取值為PTHREAD_CANCEL_DEFERRED或PTHREAD_CANCEL_ASYNCHRONOUS。

當(dāng)一個線程被創(chuàng)建后,缺省值是延遲類型。在異步方式下,線程可以在執(zhí)行的任何時候被退出。
 

【編輯推薦】

  1. Linux多線程同步之命名管道
  2. Linux多線程同步之消息隊列
  3. linux定時器的使用
責(zé)任編輯:趙寧寧 來源: 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多線程線程

2021-02-25 15:58:46

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

2011-06-22 16:08:40

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

2021-03-05 07:38:52

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

2010-01-21 11:27:30

linux多線程機制線程同步

2013-06-07 16:30:08

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

2011-06-22 16:02:37

Qt 多線程 重入

2009-06-17 11:23:00

Java多線程

2020-11-12 18:08:05

JavaLinux多線程

2013-12-02 17:33:20

Linux進(jìn)程多線程

2009-03-12 10:52:43

Java線程多線程

2017-05-27 20:59:30

Java多線程synchronize

2023-06-16 08:36:25

多線程編程數(shù)據(jù)競爭

2017-05-08 11:46:15

Java多線程

2021-06-11 11:28:22

多線程fork單線程

2017-03-08 16:25:54

Linux多線程函數(shù)

2025-06-25 06:18:46

Linux多線程機制
點贊
收藏

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