linux下的執行緒(二)

2021-06-17 00:16:56 字數 2593 閱讀 2132

清除:

執行緒終止有兩種情況:

(1)正常終止

;(2)

非正常終止

(1)

正常終止:執行緒主動呼叫pthread_exit或者從執行緒函式中return都將使執行緒正常退出,這是可預見的退出方式;

(2)

非正常終止:執行緒在其他執行緒的干預下,或者由於自身執行出錯(比如訪問非法位址)而退出,這種退出方式是不可預見的。

不論是可預見的執行緒終止還是異常終止,都會存在資源釋放的問題,如何保證執行緒終止時能順利的釋放掉自己所占用的資源,是乙個必須考慮解決的問題。

清除:

pthread_cleanup_push

的呼叫點到

pthread_cleanup_pop

之間的程式段

中的終止動作(包括呼叫

pthread_exit()

和異常終止,

不包括return

)都將執行

pthread_cleanup_push()

所指定的清理函式

(注意:

pthread_cleanup_push

和pthread_cleanup_pop

是配對使用的)

#include

void 

pthread_cleanup_push(void(*rth)(void*),void *arg)

功能:將清除函式壓入堆疊

rth :

清除函式

arg :

清除函式的引數

#include

void  pthread_cleanup_pop(int execute)

功能:將清除函式彈出堆疊

引數:

excute

執行到pthread_cleanup_pop

()時是否在彈出清理函式的同時執行該函式,

excute

的值為:非0

:執行;0:

不執行

例程:部分

void *clean(void *arg)

void *thr_fn1(void *arg)

pthread_cleanup_pop(0);

pthread_cleanup_pop(0);

return (void *)1;

}

void *thr_fn2(void *arg)

pthread_cleanup_pop(0);

pthread_cleanup_pop(0);

pthread_exit((void *)2);

}

部分執行結果:

thread 2 start

thread 2 push complete

cleanup :thread 2 second handler 

cleanup :thread 2 first handler 

(為什麼先執行cleanup :thread 2 second handler

再執行cleanup :thread 2 first handler?因為:pthread_cleanup_push( (void*)clean,"thread 2 first handler"先執行先被壓入堆疊,而pthread_cleanup_push( (void*)clean,"thread 2 second handler"後執行後被壓入堆疊;而堆疊有「先進後出」的規則);

linux下多執行緒程式設計入門(二)

上一節中,從輸出的數字分布,可以看出是 多執行緒輪流執行的,但是我們並不知道對應數字是哪乙個執行緒輸出的,這一節我們通過學習往執行緒中傳引數 以此區分執行緒。include include include void test void args 傳入的引數是 void 型別 intmain 輸出結果...

Linux系統下的多執行緒程式設計入門二

修改執行緒的屬性 在上一節的例子裡,我們用pthread create函式建立了乙個執行緒,在這個執行緒中,我們使用了預設引數,即將該函式的第二個引數設為null。的確,對大多數程式來說,使用預設屬性就夠了,但我們還是有必要來了解一下執行緒的有關屬性。關於執行緒的繫結,牽涉到另外乙個概念 輕程序 l...

Linux下多執行緒的執行緒保護

目錄 一 開發環境 二 互斥鎖 系統 ubuntu16.04 執行緒庫 pthread 語言 c c linux下的執行緒保護,最常用的是互斥鎖 條件變數 訊號量和讀寫鎖。先來試一下互斥鎖吧 多執行緒之間可能需要互斥的訪問一些全域性變數,這就需要互斥的來訪問,這些需要共享訪問的字段被稱作是臨界資源,...