執行緒學習(三)

2021-09-12 00:07:51 字數 2523 閱讀 6975

生產者抓取資料,將資料放到快取區​​中,消費者從緩衝區拿到資料進行處理。

消費者為什麼不直接獲取資料,而要經過生產者?

提高效率,資料安全程度提高。

特性:

乙個場所: 存放資源場所

兩類角色: 生產者,消費者

三種關係:(保證資源安全訪問)

生產者與生產者 ----> 互斥

消費者與消費者 ----> 互斥

生產者與消費者 ----> 同步&互斥

實際上是乙個具有等待佇列的計數器,它記錄了資源的數目。

目的:實現程序/執行緒的同步與互斥。

linux中有posix標準訊號量(庫函式實現) 和 system v訊號量 (系統呼叫)

這裡介紹posix訊號量的使用:

#include

sem_t

sem_t sem

建立訊號量

sem_init

sem_init(sem_t *sem, int pshared, unsigned int value);

初始化sem_destroy

sem_destroy(sem_t *sem);

銷毀sem_wait

sem_wait(sem_t *sem);

阻塞等待

sem_trywait

sem_trywait(sem_t *sem);

非阻塞等待

sem_timedwait

sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

阻塞限時等待

sem_post

sem_post(sem_t *sem);

喚醒等待佇列中的程序/執行緒

由於互斥鎖只能做到讀寫互斥,而讀共享沒辦法做到,所以有讀寫鎖來完成。

實現:

write 寫的時候判斷寫計數和讀計數,若都為0則可以寫操作,否則阻塞。

read 讀的時候只能要判斷寫計數,若為0,則可以讀,否則阻塞。

這裡的阻塞與以前不同,以前是死等,這裡的阻塞是自旋式(不滿足條件,一直迴圈判斷)。所以讀寫鎖就是計數加自旋鎖實現的。

因為我們知道等待的時間不長,所以迴圈判斷。

使用場景: 操作時間短,並且讀的操作多,寫的操作少。

特性:寫互斥,讀共享(但讀與寫也互斥),預設讀優先。

不能等待時間太長,否則過大耗費cpu。

讀寫鎖介面:

#include

pthread_rwlock_init

pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);

初始化pthread_rwlock_destroy

pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

銷毀pthread_rwlock_rdlock

pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

獲取阻塞性的讀鎖

pthread_rwlock_tryrdlock

pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

獲取非阻塞性的讀鎖

pthread_rwlock_wrlock

pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

獲取阻塞性的寫鎖

pthread_rwlock_trywrlock

pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

獲取非阻塞性的寫鎖

pthread_rwlock_unlock

pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

解鎖pthread_rwlockattr_init

pthread_rwlockattr_init(pthread_rwlockattr_t *attr);

讀寫鎖變數屬性初始化

pthread_rwlockattr_destroy

pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);

釋放讀寫鎖變數

pthread_rwlockattr_setkind_np

pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int pref);

設定讀寫鎖屬性優先順序(預設讀優先)

執行緒學習三 建立執行緒

目錄1.2 pthread建立執行緒 include include void foo int a int main 編譯方法 g g test.cpp o test std c 11 lpthread include include class bar int main 編譯方法 g g test...

多執行緒學習(三)

1.程序有狀態,單執行緒程序的狀態與主線程的狀態同義 2.如果主線程掛起,則程序掛起 3.單如果程序擁有多個執行緒,則所有執行緒阻塞,只有乙個啟用,則是啟用。讓程序掛起,則所有執行緒掛起 執行緒的實現模型 使用者執行緒,核心級執行緒,混合執行緒 核心執行緒由作業系統管理,程序可以有多個執行緒 pos...

執行緒池 多執行緒學習筆記(三)

執行緒池產生原因 建立很多執行緒造成的兩個問題 1.構建乙個新的執行緒會涉及到與作業系統的互動,會消耗一定的系統資源,當使用完這些新建立的執行緒後,執行緒就會被銷毀,然後當我們再建立的時候就會再次消耗系統資源,所以如果建立很多生命期很短的執行緒,就會消耗很大的系統資源,甚至給系統帶來很大的壓力。2....