線程學習筆記2

         在兩個進程間進行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)條件變量





未完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章