1. 程式人生 > >Linux執行緒淺析[關於執行緒的清理,與程序的對比,以及執行緒的各個狀態]

Linux執行緒淺析[關於執行緒的清理,與程序的對比,以及執行緒的各個狀態]

Linux執行緒淺析[執行緒資源回收]

  • 執行緒的清理和控制函式
  • 執行緒與程序對比
  • 執行緒的各種狀態

    其實之前在看到程序的時候,子程序在死亡之後,其資源回收不了,這就導致了後臺一直有個殭屍程序一直回收不了.那麼線上程中呢?執行緒雖然是共享了其程序中的記憶體資源,但是其也有獨立的棧等資源啊.那麼執行緒在執行完畢之後它的資源能否進行有效回收呢??會不會有類似程序中的wait或者waitpid函式呢???答案當然是有的.

執行緒的清理和控制函式

 在程序中我們一般使用wait或者waitpid函式,讓父程序來等待子程序執行完畢之後,來釋放子程序中的資源,而線上程用也有兩個函式(這兩個函式是一對,不可單獨進行使用).這兩個函式就是:pthread_cleanup_push,pthread_cleanup_pop函式:
 
pthread_cleanup_push ,pthread_cleanup_pop函式:


執行緒清理和控制函式:

#include<pthread.h>
void pthread_cleanup_push(void (*rtn)(void*),void *arg);
void pthread_cleanup_pop(int execute);
返回:成功返回0,失敗返回錯誤編號
引數:
    rtn:清理函式指標
    arg:呼叫清理函式傳遞的引數
    execute:值1時執行執行緒清理函式,值0時不執行執行緒清理函式

注意:在上面中其實可以看出的是push,pop那麼,這裡其採用的就是壓棧的形式,即後進先出,後註冊的,會去先執行

觸發執行緒呼叫清理函式的動作 :

    呼叫pthread_exit或者return後去執行執行緒清理函式

    響應取消請求
    用非0  execute引數呼叫thread_cleanup_pop時

    注意:它們是一組成對出現的:等同於:
    while(execute){
        //執行執行緒處理函式
    }

 下面通過一個簡單的小例子來看一下:同樣是也類似於singal函式吧,因為在捕捉到執行緒死亡之後,pthread_cleanup_pop方法才會生效
 

/*
 * ===========================================================================
 *
 *       Filename:  pthread_clean_up.c
 *    Description:  
 *        Version:  1.0
 *        Created:  2017年03月26日 21時34分50秒
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:   (), 
 *        Company:  
 *
 * ===========================================================================
 */
#include<stdio.h> #include<stdlib.h> #include<pthread.h> /** * 執行緒執行的清理函式(一般在這裡負責相關資源的釋放工作) */ void* clean_function(void* argv){ int *arg =(int *)argv; printf("clean funtion pthread id:%lx\n",pthread_self()); return (void*)0; } /* * * 執行緒的執行函式 * */ void* th_function1(void* argv){ int *arg = (int*)argv; // pthread_cleanup_push(clean_function,(void*)arg); printf("pthread id:%lx,arg:%d\n",pthread_self(),arg); pthread_cleanup_pop(arg); return (void*)0; } int main(int argc,char *argv[]){ pthread_t pthread_one,pthread_two; int result = 0; //線上程中傳入一個0,用於清理函式在註冊執行的時候也去傳0,pthread_cleanup_pop函式引數為0的時候是不去執行的 if((result = pthread_create(&pthread_one,NULL,th_function1,(void*)0))!=0){ perror("pthread create error"); } //線上程中傳入1,然後在通過執行函式,將1傳入到清理函式中,pthread_cleanup_pop函式引數為1的時候會執行註冊的函式 if((result = pthread_create(&pthread_two,NULL,th_function1,(void*)1))!=0){ perror("pthread create error"); } pthread_join(pthread_one,NULL); pthread_join(pthread_two,NULL); printf("pthread:%lx is end\n",pthread_self()); return 0; }

 類比一下吧.其實這兩個函式也就類似程序中singnal函式一樣,但是好像其被拆分成兩個函式同步去使用,一個用於註冊執行的函式,一個用來註冊是否去捕捉執行緒dead狀態,所謂的清理函式,其實就是監聽了執行緒的死亡,線上程死亡過後,需要針對這種情況做出一些響應,類似程序清理函式atexit函式

執行緒與程序對比

 簡單對比一下吧,其在不同狀態下的不同函式呼叫

狀態 程序 執行緒
建立 fork/vfork pthead_create
退出 exit/return/_exit return/pthread_exit
等待回收 wait/waitpid pthread_join
相關清理函式 atexit pthread_cleanup_push/pthread_cleanup_pop

執行緒的各種狀態

先來一副圖:
這裡寫圖片描述

看到這幅圖的時候,如果除去其中的函式呼叫,是不是跟程序的狀態圖很相似.
 關於這些狀態就不在這裡贅述.結合程序的狀態圖可以有更深的認識,同樣也可結合java中執行緒的生生命週期來檢視http://blog.csdn.net/qq_29924041/article/details/63255854

寫的不好,還望見諒

相關推薦

Linux執行淺析[關於執行清理程序對比以及執行各個狀態]

Linux執行緒淺析[執行緒資源回收] 執行緒的清理和控制函式 執行緒與程序對比 執行緒的各種狀態 其實之前在看到程序的時候,子程序在死亡之後,其資源回收不了,這就導致了後臺一直有個殭屍程序一直回收不了.那麼線上程中呢?執行緒雖然是共享了其程序中的記憶體資

iOS中保證執行安全的幾種方式效能對比

一、前言 前段時間看了幾個開源專案,發現他們保持執行緒同步的方式各不相同,有@synchronized、NSLock、dispatch_semaphore、NSCondition、pthread_mutex、OSSpinLock。後來網上查了一下,發現他們的實現機制各不相同,效能也各不一

Java多執行程式設計-(5)-使用Lock物件實現同步以及執行間通訊

前幾篇: 在《Java多執行緒程式設計-(4)-執行緒間通訊機制的介紹與使用》已經學習了,可以使用方法wait/notify 結合同步關鍵字syn

singleton懶漢式餓漢式以及執行安全(雙檢鎖)

/************************************************************************* > File Name: Singleton.cpp > Created Time: Tue 31 Oct 2017 10:20:

程序間通訊以及執行同步

程序間通訊:程序之間不共享資料,因此程序間通訊需要特殊方式進行通訊#管道 pipe 半雙工通訊方式,資料單向流動 ,父子程序中使用#命名管道 非親緣關係之間的通訊#訊號量 (同步手段)#訊息佇列:訊息的連結串列,存放在核心中並有訊息佇列識別符號標識#訊號 :訊號是一種比較複雜

C#託管的中間程式碼IL為什麼和機器程式碼執行速度一樣快Java對比

C#託管的中間程式碼IL為什麼和機器程式碼執行速度一樣快,IL是即時編譯的(JIT),java位元組碼是解釋型的。java會把所有的程式碼都編譯完,在下次執行時就不需要再去編譯已經編譯過的程式碼。微軟對編譯做了優化,JIT只編譯呼叫的程式碼,因為程式執行過程中,大部分程式碼都

Linux中find命令exec合用按修改時間查詢等

find是我們很常用的一個Linux命令,但是我們一般查找出來的並不僅僅是看看而已,還會有進一步的操作,這個時候exec的作用就顯現出來了。 exec解釋: -exec  引數後面跟的是command命令,它的終止是以;為結束標誌的,所以這句命令後面的分號是不可缺少的,考慮

小白學JAVA你們感同身受JAVA---day5:關於多型的理解和分析。魯迅的一句話:總之歲月漫長,然而值得等待。

魯迅的一句話:總之歲月漫長,然而值得等待。 至於是不是他說的,就看大家的了。   /* 多型:事物存在的多種形態。 多型的前提: 1.要有繼承關係。 2.要有方法的重寫。 3.要有父類引用指向子類物件。 向上轉型和向下轉型: 1.父類引用指向子類物件   &nbs

Python 程序程序獲取程序id給子程序傳遞引數

  執行緒與執行緒之間共享全域性變數,程序之間不能共享全域性變數。 程序與程序相互獨立  (可以通過socket套接字實現程序間通訊,可以通過硬碟(檔案)實現程序通訊,也可以通過佇列(Queue)實現程序通訊) 子程序會拷貝複製主程序中的所有資源(變數、函式定義等),所以

紅包牆系統線上結合線下商場商鋪推廣新方式

微信紅包牆系統(紅包牆、微客來、碼上拓客、拓客來等統稱紅包牆系統)火熱招商、轉讓軟體技術,讓您的手機、電腦變成印鈔機! 隨著微信和二維碼的普及,掃碼送紅包已經被很多企業應用在市場上。創新就是一種改革,資訊時代,市場經濟瞬息萬變,唯有快速適應並有好的營銷方案,才能

加密演算法RSAECC對比以及Android、java中使用

一、加密演算法前言 根據金鑰型別不同將現代密碼技術分為兩類:對稱加密演算法和非對稱加密演算法。對稱鑰匙加密系統是加密和解密均採用同一把祕金鑰匙,而且通訊雙方都必須獲得這把鑰匙,並保持鑰匙的祕密。 非對稱金鑰加密系統採用的加金鑰匙(公鑰)和解金鑰匙(私鑰)是不同的。 常見

小白學JAVA你們感同身受JAVA---day8:開發環境。魯迅的一句話:總之歲月漫長,然而值得等待。

魯迅的一句話:總之歲月漫長,然而值得等待。 /* 開發環境: Eclipse Myeclipse ==與equals的比較: 共同點:都可以做比較,返回值都是boolean。 區別: 1.=

敏捷的商業價值是什麼傳統對比的特點是什麼?

敏捷決不再侷限於研發的生產階段,是貫穿軟體生命週期,敏捷價值也只有充分體現在產品在從一個抽象概念到客戶漸漸上手體會到產品的真正使用價值和解決方案在組織內獲得成功才凸顯出來。 敏捷的核心價值用一言以蔽之,則是敏捷是充分的將人的時間、精力、金錢始終集中在最有業務價值的部分,而以

vuereact對比相同之處不同之處。

兩者都為當下主流框架 相同之處在於: 一、使用 Virtual DOM 二、提供了響應式 (Reactive) 和元件化 (Composable) 的檢視元件。 三、將注意力集中保持在核心庫,而將其他功能如路由和全域性狀態管理交給相關的庫。 不同之處: 一、在 Rea

[轉載]AlphaGo 的棋局人工智慧有關人生無關

編者注:本文作者系出門問問 NLP 工程師李理,他在這篇文章詳細敘述了AlphaGo 人工智慧背後的細節。 前言:人生如棋 回顧一下我的人生,似乎和棋是有一些關聯的。編者注:本文作者出門問問 1997 年中考後的暑假在姑父公司的機房第一次接觸電腦,當

goldengate源端意外宕機傳輸程序終止導致OGG-01031報錯

伺服器宕機,沒有停止dpump程序,啟動後處於abend狀態,檢查ggserr.log報以下錯誤: 2011-04-01 11:13:19 ERROR OGG-01031 Oracle GoldenGate Capture for Oracle, dpump.prm: There is a proble

EurekaZooKeeper對比Eureka的優勢

為什麼不應該使用ZooKeeper做服務發現 背景 很多公司選擇使用ZooKeeper作為Service發現服務(Service Discovery),但是在構建Knewton(Knewton是一個提供個性化教育平臺的公司、學校和出版商可以通過Knewton平臺為學生提供

12_Delete不釋放高水位線的問題truncate對比實驗

Delete不釋放高水位線的問題,與truncate對比實驗Oracle高水位線 HWM對資料庫影響:1. 全表掃描通常要讀取直到HWM標記內,所有屬於該表資料庫塊,即使該表中沒有任何資料,這樣將耗費更多的I/O資源;2. 即使HWM以下有空閒的資料庫塊,鍵入在插入資料時使用

[原]nginx折騰記(HTTP效能能測試Apache對比

話說nginx在大壓力的環境中比apache的表現要好,於是下載了一個來折騰一下。 下載並編譯安裝,我的編譯過程有點特別: 1。去除除錯資訊,修改$nginx_setup_path/auto/cc/gcc這個檔案,將 CFLAGS="$CFLAGS -g"

Hadoop 對比如何看待 Spark 技術?

hadoop和Spark是兩種不同的大資料處理框架,他們的元件都非常多,往往也不容易學,我把他們兩者整理在一幅圖中,給大家一個全貌的感覺。以上這些大資料元件是日常大資料工作中經常會碰到的,每個元件大概的功能,我已經在圖中做了標識。下面,針對這幅圖我給大家兩點重要提示:a.藍色部分,是Hadoop生態系統元件,