歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Linux Pthread 總結

Linux Pthread 總結

日期:2017/3/3 12:34:28   编辑:Linux技術
POSIX線程(POSIX
threads),簡稱Pthreads,是線程的POSIX標准。該標准定義了創建和操縱線程的一整套API。在類Unix操作系統(Unix、Linux、Mac
OS X等)中,都使用Pthreads作為操作系統的線程。Windows操作系統也有其移植版pthreads-win32。
作用
線程庫實行了POSIX線程標准通常稱為Pthreads。POSIX線程具有很好的可移植性,使用pthreads編寫的代碼可運行於Solaris、FreeBSD、Linux 等平台,Windows平台亦有pthreads-win32可供使用[1] 。
Pthreads定義了一套C語言的類型、函數與常量,它以pthread.h頭文件和一個線程庫實現。


數據類型

編輯
pthread_t:線程ID
pthread_attr_t:線程屬性


操縱函數

編輯
pthread_create():創建一個線程
pthread_exit():終止當前線程
pthread_cancel():中斷另外一個線程的運行
pthread_join():阻塞當前的線程,直到另外一個線程運行結束
pthread_attr_init():初始化線程的屬性
pthread_attr_setdetachstate():設置脫離狀態的屬性(決定這個線程在終止時是否可以被結合)
pthread_attr_getdetachstate():獲取脫離狀態的屬性
pthread_attr_destroy():刪除線程的屬性
pthread_kill():向線程發送一個信號


同步函數

編輯
用於 mutex 和條件變量
pthread_mutex_init() 初始化互斥鎖
pthread_mutex_destroy() 刪除互斥鎖
pthread_mutex_lock():占有互斥鎖(阻塞操作)
pthread_mutex_trylock():試圖占有互斥鎖(不阻塞操作)。即,當互斥鎖空閒時,將占有該鎖;否則,立即返回。
pthread_mutex_unlock(): 釋放互斥鎖
pthread_cond_init():初始化條件變量
pthread_cond_destroy():銷毀條件變量
pthread_cond_signal(): 喚醒第一個調用pthread_cond_wait()而進入睡眠的線程
pthread_cond_wait(): 等待條件變量的特殊條件發生
Thread-local storage(或者以Pthreads術語,稱作線程特有數據):
pthread_key_create(): 分配用於標識進程中線程特定數據的鍵
pthread_setspecific(): 為指定線程特定數據鍵設置線程特定綁定
pthread_getspecific(): 獲取調用線程的鍵綁定,並將該綁定存儲在 value 指向的位置中
pthread_key_delete(): 銷毀現有線程特定數據鍵
pthread_attr_getschedparam();獲取線程優先級
pthread_attr_setschedparam();設置線程優先級


工具函數

編輯
pthread_equal(): 對兩個線程的線程標識號進行比較
pthread_detach(): 分離線程
pthread_self(): 查詢線程自身線程標識號
-
1.線程特點
-
2.pthread創建
-
3.pthread終止
- 4.mutex互斥量使用框架
- 5.cond條件變量
================================================================================================
1. 線程特點
線程擁有自己獨立的棧、調度優先級和策略、信號屏蔽字(創建時繼承)、errno變量以及線程私有數據。進程的其他地址空間均被所有線程所共享,因此線程可以訪問程序的全局變量和堆中分配的數據,並通過同步機制保證對數據訪問的一致性。
2. pthread創建
pthread有一個線程ID,類型為pthread_t,在使用printf打印時,應轉換為u類型。
pthread_equal可用於比較兩個id是否相等;pthread_self用於獲取當前線程的ID。
pthread_create用於創建新的線程,可以給線程傳入一個void *類型的參數,例如一個結構體指針或者一個數值。
系統並不能保證哪個線程會現運行:新創建的線程還是調用線程。
3. pthread終止
a) 從線程函數中返回
b) 被同一進程中的其他線程取消
c) 線程調用pthread_exit
注意,線程的返回值需要轉換為void *類型。
pthread_exit(void *ret)
pthread_join(pthread_t id, void **ret)
ret均可設置為NULL
4. mutex 互斥量使用框架
pthread_mutex_t lock;
pthread_mutex_init 或者 PTHREAD_MUTEX_INITIALIZER(僅可用在靜態變量)
pthread_mutex_lock / pthread_mutex_unlock / pthread_mutex_trylock
pthread_mutex_destroy
5. cond 條件變量
pthread_cond_t qready;
pthread_mutex_t qlock;
pthread_mutex_init 或者 PTHREAD_MUTEX_INITIALIZER
pthread_cond_init 或者 PTHREAD_COND_INITIALIZER
pthread_mutex_lock(&qlock...)
pthread_cond_wait(&qready, &qlock...) / pthread_cond_timewait
pthread_mutex_unlock(&qlock)
pthread_cond_destroy
//喚醒條件變量
pthread_cond_signal
pthread_cond_broadcast
條件變量是pthread中比較難以理解的一點,主要會產生以下疑惑:
Q1. 假如在調用pthread_{cond_wait | cond_timedwait}之前就調用pthread_cond_{signal | broadcast}會發生什麼?
Q2. pthread_cond_{cond_wait | cond_timewait}為什麼需要一個已經鎖住的mutex作為變量?
Q3. pthread_cond_{signal | broadcast}使用之前必須獲取wait中對應的mutex嗎?
Q4. 假如pthread_cond_{signal | broadcast}必須獲取mutex,那麼下列兩種形式,哪種正確?為什麼?
1)
lock(lock_for_X);
change(X);
unlock(lock_for_X);
pthread_cond_{signal | broadcast};
2)
lock(lock_for_X);
change(X);
pthread_cond_{signal | broadcast};
unlock(lock_for_X);
Copyright © Linux教程網 All Rights Reserved