執行緒學習筆記2

2021-06-27 13:16:21 字數 2562 閱讀 2821

在兩個程序間進行socket通訊中,在其中乙個程序中建立新的執行緒,用於監聽,程式設計中發現自己對執行緒的操作僅限於執行緒的建立,銷毀,以及互斥量的操作,感覺還有許多關於執行緒的東西沒有掌握,so,需要好好學習總結一下,不足之處望指出!

為什麼要引入執行緒呢?

雖然程序可以提高cpu的利用率,但是程序之間的切換是非常耗費資源和時間的,為了能更進一步的提高作業系統的併發進,引進了執行緒。這樣,程序是分配資源的基本單位,而執行緒則是系統排程的基本單位。乙個程序內部的執行緒可以共享該程序的所分配到的資源。執行緒的建立與撤消,執行緒之間的切換所占用的資源比程序要少很多,總的來說就是為了更進一步提高系統的併發性,提高cpu的利用率。

執行緒標識

執行緒id使用資料型別pthread_t表示,關於執行緒標識的函式有:

(1)int pthread_equal(pthread_t tid1, pthread_t tid2); 比較兩個執行緒id,相等返回非0  ,不等返回0

(2)pthread_t pthread_self(); 獲取執行緒自身的id 。

執行緒的建立

int pthread_create(pthread_t  *tidp,const pthread_attr_t   *attr,void *(func)(),void arg); 成功返回0 ,錯誤返回錯誤編號。

第二個引數用於指定執行緒的屬性,一般置為null 。

執行緒終止

執行緒退出的三種方式:

(1)從啟動例程中返回,返回值是執行緒的退出碼

(2)被同一程序中的其他執行緒取消

(3)執行緒呼叫pthread_exit函式退出

void pthread_exit(void *rval);執行緒退出,返回值(退出碼)儲存到rval中。

當執行緒需要使用某執行緒的退出碼時,就會用到pthread_join()函式,該函式用於阻塞等待某執行緒的退出,並儲存該執行緒的退出碼到第二個引數中,當執行緒終止時,該函式將會**該執行緒的資源,若成功返回0,函式原型如下:

int pthread_join(pthread_t thread,void ** rval);如果執行緒處於分離狀態,該函式將不能用於等待該分離執行緒的結束。對於分離執行緒,沒有被其他執行緒等待,執行完畢後,將自動釋放系統資源。

執行緒如果想取消同一程序中的其他執行緒,需要使用pthread_cancel函式提出申請,僅僅是提出申請,函式原型為:

int pthread_cancel(pthread_t tid);

執行緒退出清理

當執行緒退出時,可以指定執行的函式,以完成清理工作,需要使用如下兩個函式:

void pthread_cleanup_push(void (*fun)(void *),void *arg);

void pthread_cleanup_pop(int execute);

為執行退出清理函式,需要使用第乙個函式註冊退出需要執行的函式,由於使用棧,所以函式執行順序與註冊順序相反。

使用第乙個函式完成註冊後,什麼時候會呼叫註冊的函式呢?

(1)當呼叫pthread_exit()函式時,會呼叫註冊的函式完成清理工作;

(2)相應上面所說的取消請求時,會呼叫註冊的函式完成清理工作;

(3)使用pthread_cleanup_pop函式時(引數必須為非0,才會呼叫清理函式,且push次數和pop次數相等),會呼叫註冊的函式完成清理工作。

若註冊了函式a和函式b,但是需要退出時,僅需執行a,可以使用pthread_cleanup_pop(0),將b彈出,然後在使用(1)、(2)或(3)呼叫清理函式。

注意:如果執行緒是使用return進行返回時,將不會呼叫其註冊的清理函式。

執行緒同步

執行緒同步時執行緒的關鍵點,如何進行執行緒同步處理呢?

(1)互斥鎖

使用資料型別pthread_mutex_t定義互斥量 mutex

使用函式int  pthread_mutex_init(&mutex,null),初始化互斥量

使用函式int  pthread_mutex_lock(&mutex);獲取互斥量

使用函式int  pthread_mutex_unlock(&mutex);釋放互斥量

使用函式int  pthread_mutex_destory(&mutex);銷毀互斥量

使用函式int  pthread_mutex_lock(&mutex);為阻塞獲取互斥鎖,若非阻塞獲取可使用函式int  pthread_mutex_trylock(&mutex);

(2)讀寫鎖

使用資料型別pthread_rwlock_t定義讀寫鎖rwlock

使用函式pthread_rwlock_init(&rwlock,null),初始化

使用函式pthread_rwlock_rdlock(&rwlock);獲取讀鎖

使用函式pthread_rwlock_wrdlock(&rwlock);獲取讀寫鎖

使用函式pthread_rwlock_undlock(&rwlock);釋放鎖

使用函式pthread_rwlock_destory(&rwlock);銷毀鎖

(3)條件變數

未完成

核心執行緒學習筆記總結2

include linux module.h include linux kernel.h include linux init.h include linux sched.h module author t bagwell cu module license gpl static declare ...

執行緒學習筆記(2) 互斥物件

執行緒學習筆記 2 互斥物件 1 互斥物件的概念 互斥物件是系統核心維護的一種資料結構,它定保證了物件對單個執行緒的訪問權.互斥物件的結構 包含了乙個使用數量,乙個執行緒id,乙個計數器使用數量是指有多少個執行緒在調 該物件,執行緒id是指互斥物件維護的執行緒的id.計數器表示當前執行緒呼叫該物件的...

知了堂學習筆記 執行緒2

1.執行緒的狀態 new thread 執行緒被建立 執行緒可執行狀態,搶到cpu才是真正的執行狀態 執行過程中cpu被搶 sleep wait 阻塞 結束 執行緒自動執行完 推薦 標誌位 2.執行緒的常用方法 sleep 執行緒休眠 讓出cpu,不讓出鎖 interrupt 打斷執行緒的sleep...