20160825
unix環境高階程式設計
-執行緒與執行緒控制總結
1.兩個執行緒
id進行比較
函式:#include
int pthread_equal(pthread_t tid1,pthread_t tid2);
應用場景:
2.獲取自身的執行緒
id
函式:#include
pthread_t pthread_self(void);
應用場景:
1.程式除錯過程中列印執行緒
id有時是非常有用的。
2.用執行緒
id標示工作佇列資料結構,執行緒池中不同執行緒通過
id識別處理佇列中相同
id的工作。
3.執行緒的建立
函式:#include
int pthread_create(pthread_t *, const pthread_attr_t *,
void *(*start_rtn)(void), void *restrict arg);
注意:1.主線程和新執行緒之間的競爭。
2.主線程不休眠,有可能新執行緒還沒有執行之前整個程序可能就已經終止。這種特徵依賴於
os中線程實現和排程演算法。
3.linuxos使用
clone
系統呼叫來實現
pthread_create
,故主線程和新執行緒的父程序
id不同。
clone
建立子程序,可以共享父程序一定數量的執行環境(檔案描述符和記憶體)。
4.執行緒的終止
函式:#include
int pthread_exit(void *rval_ptr);
int pthread_join(pthread_t thread, void **rval_ptr);
注意:程序中任一線程呼叫exit
,_exit,
那麼整個程序就會終止。整個程序不終止情況下結束單個執行緒,三種方式:
1.執行緒執行完,直接返回退出。
2.執行緒被同一程序中的其他執行緒取消
pthread_join。
3.執行緒呼叫
pthread_exit。
其他函式:
int pthread_cancel(pthread_t tid); /*請求控制流的非正常退出*/
void pthread_cleanup_push(void (*rtn)(void *), void *arg);/*建立執行緒清理處理程式*/
void pthread_cleanup_pop(int execute); /*執行執行緒清理處理程式*/
5.使執行緒進入分離狀態
函式:#include
int pthread_detach(pthread_t tid);
6.執行緒互斥量
6.1互斥量初始化與銷毀
函式:#include
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
注意:1.互斥變數用
pthread_mutex_t
資料型別表示。
2.使用互斥變數之前,必須首先初始化,也可以把它設定為常量
pthread_mutex_initializer(
只對靜態分配的互斥量)。
3.動態分配(
malloc
)互斥量,在釋放記憶體前需要呼叫
***_destroy()
函式。
6.2互斥量加解鎖
函式:int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
注意:1.使用
***_trylock
執行緒不被阻塞,不能鎖住則返回
ebusy。
2.避免死鎖:兩個執行緒對兩個互斥量同時加鎖,如果乙個執行緒以與另乙個執行緒相反的順序鎖住互斥量,則才可能出現死鎖,如果以相同的順序加鎖,則可避免死鎖。
3.鎖的粒度:太粗,多執行緒阻塞等待相同的鎖,併發性的改善微乎其微;太細,**變複雜,鎖的開銷很大。
7.執行緒讀寫鎖
7.1讀寫鎖初始化與銷毀
函式:#include
int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
7.2讀寫鎖加解鎖
函式:#include
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
注意:1.作業請求佇列由單個讀寫鎖保護,以此實現多個工作執行緒獲取由單個主線程分配給它們的作業。示例「
程式清單11-8
使用讀寫鎖
」。2.讀寫鎖非常適合於對資料結構讀的次數遠大於寫的情況,多個執行緒可以同時讀,故並行性比互斥量更高。
8.執行緒條件變數
8.1條件變數初始化與銷毀
函式:#include
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *attr);
int pthread_cond_destroy(pthread_cond_t *cond);
注意:1.條件變數可以用兩種方式初始化:用常量
pthread_cond_initializer
或使用pthread_cond_init
函式。
8.2條件變數等待與訊號
函式:#include
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *timeout);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
注意:1.timeout時間值是乙個絕對數而不是相對數,可以使用
gettimeofday
獲取當前時間、使用
maketimeout
進行時間格式轉換。
2.條件變數給多個執行緒提供了乙個會和場所。條件變數與互斥量一起使用時,允許執行緒以無競爭的方式等待特定的條件發生。
應用模板:
struct msg *workq;
pthread_cond_t qready = pthread_cond_initializer;
pthread_mutex_t qlock = pthread_mutex_ initializer;
pthread#1:{
pthread_mutex_lock(&qlock);
while (workq == null)
pthread_cond_wait(&qready, &qlock);
… … /*出隊等等操作*/
pthread_mutex_unlock(&qlock);
pthread#2:{
pthread_mutex_lock(&qlock);
… … /*入隊等等操作*/
pthread_mutex_unlock(&qlock);
pthread_cond_signal(&qready);
9.執行緒的控制
9.1執行緒限制於屬性
9.2執行緒同步屬性與重入
9.3執行緒私有資料
9.4執行緒與訊號、
fork
、i/o
執行緒控制函式
執行緒共享資源如下 靜態資料 程序中開啟的檔案描述符 當前工作目錄 使用者i d int pthread create pthread t thread,pthread attr t attr,void start routine void void arg 函式作用建立乙個執行緒 thread 執...
linux執行緒控制
1.執行緒屬性 a 分離狀態 不需要了解執行緒返回終止狀態時設定 b 棧末尾警戒緩衝區 避免棧溢位的擴充套件記憶體大小,一般系統設定為頁的整數倍 c 棧的最小位址 i.當有許多執行緒時,減少棧大小 ii.當執行緒中有許多自動變數時,則增大棧大小 d 棧的最小長度 2.互斥量屬性 a 程序共享屬性 i...
Linux 執行緒控制
話不多說,直接進入正題!1.什麼是執行緒?2.執行緒控制 2.1 執行緒建立int pthread create pthread t tid,pthread attr t attr,void start routine void void arg tid 返回執行緒id attr 設定執行緒的屬性,...