生產者抓取資料,將資料放到快取區中,消費者從緩衝區拿到資料進行處理。
消費者為什麼不直接獲取資料,而要經過生產者?
提高效率,資料安全程度提高。
特性:
乙個場所: 存放資源場所實際上是乙個具有等待佇列的計數器,它記錄了資源的數目。兩類角色: 生產者,消費者
三種關係:(保證資源安全訪問)
生產者與生產者 ----> 互斥
消費者與消費者 ----> 互斥
生產者與消費者 ----> 同步&互斥
目的:實現程序/執行緒的同步與互斥。
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....