1. 程式人生 > >linux多執行緒-執行緒資源釋放

linux多執行緒-執行緒資源釋放

般來說,對一段執行程式碼進行加鎖然後解鎖,如下所示:

  pthread_mutex_lock(&mutex);

  //執行程式碼;

  pthread_mutex_unlock(&mutex);

  如果在執行程式碼這塊發生錯誤,有異常,導致這個執行緒異常退出,那麼怎麼辦,pthread_unlock沒有得到呼叫,那麼這個鎖資源沒有解鎖。可以用下面的方法修改。

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

  pthread_mutex_lock(&mutex);

  /* do some work */

  pthread_mutex_unlock(&mutex);

  pthread_cleanup_pop(0);

  這樣假如執行程式碼發生錯誤時沒有呼叫到解鎖,pthread_cleanup_up會自動來呼叫,引數為0表示不執行push進來的函式。

  但是如果是異常錯誤的話,這個引數並不影響異常終止時清理函式的執行。

  必須要注意的是,如果執行緒處於PTHREAD_CANCEL_ASYNCHRONOUS狀態,上述程式碼段就有可能出錯,因為CANCEL事件有可能在pthread_cleanup_push()和pthread_mutex_lock()之間發生,或者在pthread_mutex_unlock()和pthread_cleanup_pop()之間發生,從而導致清理函式unlock一個並沒有加鎖的mutex變數,造成錯誤。因此,在使用清理函式的時候,都應該暫時設定成PTHREAD_CANCEL_DEFERRED模式。為此,POSIX的Linux實現中還提供了一對不保證可移植的pthread_cleanup_push_defer_np()/pthread_cleanup_pop_defer_np()擴充套件函式,功能與以下程式碼段相當:

  { int oldtype;

  pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);

  pthread_cleanup_push(routine, arg);

  ...

  pthread_cleanup_pop(execute);

  pthread_setcanceltype(oldtype, NULL);

  }

  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  設定退出型別pthread_setcanceltype

  #include <pthread.h>

  int pthread_setcanceltype(int type, int *oldtype);

  返回值:函式成功返回0。任何其他返回值都表示錯誤。

  將執行緒退出型別設定為延遲型別或非同步型別。引數type的取值為PTHREAD_CANCEL_DEFERRED或PTHREAD_CANCEL_ASYNCHRONOUS。

  當一個執行緒被建立後,預設值是延遲型別。在非同步方式下,執行緒可以在執行的任何時候被退出。


相關推薦

Linux程序和執行同步的幾種方式

   引用:http://community.csdn.net/Expert/TopicView3.asp?id=4374496 linux下程序間通訊的幾種主要手段簡介:    1. 管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的

linux執行-執行資源釋放

般來說,對一段執行程式碼進行加鎖然後解鎖,如下所示:   pthread_mutex_lock(&mutex);   //執行程式碼;   pthread_mutex_unlock(&mutex);   如果在執行程式碼這塊發生錯誤,有異常,導致這個執行緒異

Linux:找出cpu資源佔用最的那個執行

在這裡對linux下、sun(oracle) JDK的執行緒資源佔用問題的查詢步驟做一個小結;linux環境下,當發現java程序佔用CPU資源很高,且又要想更進一步查出哪一個java執行緒佔用了CPU資源時,按照以下步驟進行查詢: 先用top命令找出佔用資源厲害的java

Linux執行程式設計---執行間同步(互斥鎖、條件變數、訊號量和讀寫鎖)

本篇博文轉自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。  下面是思維導

LINUX 執行 JNI 回撥 java static

1.Linux 開啟執行緒 //渲染執行緒Rendering void* thread_rendering_process(void *lParam) {     unsigned int local_wr;     int index; &

linux 執行之訊號量 sem_init

1. 什麼是訊號量 linux sem 訊號量是一種特殊的變數,訪問具有原子性, 用於解決程序或執行緒間共享資源引發的同步問題。 使用者態程序對 sem 訊號量可以有以下兩種操作: 等待訊號量 當訊號量值為 0 時,程式等待;當訊號量值大於 0 時,訊號量減 1,程式

Linux執行學習總結

原文:https://www.cnblogs.com/luoxn28/p/6087649.html Linux多執行緒學習總結   執行緒是程式中完成一個獨立任務的完整執行序列,即一個可排程的實體;程序相當於執行中程式的一種抽象。根據執行環境的排程者的身份,執行緒可分為核心執行緒和使用者執行

Linux執行/客戶程式設計參考/程式碼

Linux多執行緒/多客戶程式設計參考/程式碼 (1)linux多執行緒程式設計例項及講解 https://blog.csdn.net/m0_37051593/article/details/80719469 (2)Linux多執行緒程式設計——多執行緒與執行緒同步 https://

Linux程序和執行的優缺點

教科書上最經典的一句話是“程序是作業系統分配的最小單位,執行緒是CPU排程的最小單位”。 多執行緒的優點: 1)它是一種非常”節儉”的多工操作方式。在Linux系統下,啟動一個新的程序必須分配給它獨立的地址空間,建立眾多的資料表來維護它的程式碼段、堆疊段和資料段,這是一種”昂貴”

Linux執行同步機制

一、互斥鎖 儘管在Posix Thread中同樣可以使用IPC的訊號量機制來實現互斥鎖mutex功能,但顯然semphore的功能過於強大了,在Posix Thread中定義了另外一套專門用於執行緒同步的mutex函式。 1. 建立和銷燬    有兩種方法建

Linux 執行程序的區別(小結)

最近學習Linux,看到“hairetz的專欄”的帖子不錯,特轉來大家一起學習。 很想寫點關於多程序和多執行緒的東西,我確實很愛他們。但是每每想動手寫點關於他們的東西,卻總是求全心理作祟,始終動不了手。 今天終於下了決心,寫點東西,以後可以再修修補補也無妨。一.為何需要多程序(或者多執行緒),為何需

【面試題】執行執行過程中,某個執行執行時,突然釋放鎖。會發生的特殊狀態

一,背景 今天在刷面試題的時候,做到一道面試題,雖然看了答案,但有一個答案還是不理解。後來研究了一下,得到結論:執行緒拿到鎖進行執行時,哪怕獲得了CPU執行權,但是那個鎖不能丟失,它後面執行的過程都需要帶著鎖,才能往下繼續執行。 二,測試程式碼 /**

linux執行執行資料TSD Thread Specific Data

在linux中,同一程序下所有執行緒是共享全域性變數的,但有時候會有這樣的需求,某一個執行緒想單獨用於某個全域性變數。這就有了TSD,Thread Specific Data。 使用TSD時需要建立一個全域性的鍵值,每個執行緒都通過鍵值來設定和獲取自己所獨有的全域性變數。 使用TSD分為

OS:(Linux)執行實現生產者-消費者問題--pthread庫

OS實驗——多執行緒實現生產者-消費者問題時,正確輸入程式碼生成檔案pthread.c,在終端執行: gcc編譯:輸入gcc -o pthread pthread.c 無法成功編譯,錯誤提示如下:   CSDN查詢解決方案後,發現pthread庫並不是Linux系統預設的庫,連結時需要使

linux執行入門(二)互斥量

當多個執行緒訪問一個共享的變數的時候是非常危險的,可能會拿到錯誤的資料或者程式崩潰! 所以為了安全的使用執行緒引入了互斥量的做法 兩個互斥量的函式為 pthread_mutex_lock(pthread_mutex_lock* lock) pthread_mutex_unlock(p

linux 執行 定時器

  linux則只允許單程序擁有一個定時器,因此在linux下的單程序中要使用多個定時器,則需要自己維護管理。 方法一: 程序中只有一個定時器,通過標誌位,可以在不同時間執行不同的任務。 方法二: Linux程序多個定時器  實現資料更新 資料上傳 #in

linux程序和執行

轉載自CodeUniverse的部落格 程序:可執行程式是儲存在磁碟裝置上的由程式碼和資料按某種格式組織的靜態實體,而程序是可被排程的程式碼的動態執行。 在Linux系統中,每個程序都有各自的生命週期。在一個程序的生命週期中,都有各自的執行環境以及所需的資源,這些資訊都記錄在各自的程序控制塊中,以便系統對

linux執行程式設計,用 pthread_cond_timedwait 代替sleep

摘要:多執行緒程式設計中,執行緒A迴圈計算,然後sleep一會接著計算(目的是減少CPU利用率);存在的問題是,如果要關閉程式,通常選擇join執行緒A等待執行緒A退出,可是我們必須等到sleep函式返回,該執行緒A才能正常退出,這無疑減慢了程式退出的速度。當然,你可以terminate執行緒A,但

Linux執行學習(三)pthread_key_create

函式 pthread_key_create() 用來建立執行緒私有資料。該函式從 TSD 池中分配一項,將其地址值賦給 key 供以後訪問使用。第 2 個引數是一個銷燬函式,它是可選的,可以為 NULL,為 NULL 時,則系統呼叫預設的銷燬函式進行相關的資料登出。如果不為空

Linux 執行】同一個程序中的執行共享哪些資源

程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位.  執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧)