Linux執行緒與執行緒控制函式 筆記

2021-08-01 02:56:12 字數 4769 閱讀 5670

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 設定執行緒的屬性,...