? 1.1條件變量

int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t*restrict attr);參數:cond:要初始化的條件變量attr:NULL
int pthread_cond_destroy(pthread_cond_t *cond)
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrictmutex);參數:cond:要在這個條件變量上等待mutex:互斥量,等待期間解鎖,喚醒時再次加鎖
int pthread_cond_broadcast(pthread_cond_t *cond);int pthread_cond_signal(pthread_cond_t *cond);
? 1.4 生產者消費者模型
? 生產者消費者模型的優點:(1)解耦合 (2)支持并發 (3)支持忙先不均
? 1.5基于BlockingQueue的?產者消費者模型
簡單示例:
? 這里封裝了一個BlockQue類,成員變量說明:定義了最大容量,一個互斥鎖,生產者與消費者應該是互斥的,否則會導致數據錯亂,設置了兩個條件變量分別在隊列為空和滿的時候使線程進入等待,當隊列有元素或不為空時由生產者或消費者線程根據wait_nums來決定是否喚醒對應的等待線程。成員函數說明:生產者與生產者之間,消費者與消費者是互斥的,所以在進入生產和消費的時候只允許一個線程進入,隊列為空或滿時都會進入等待,此時為了防止偽喚醒使用while循環來控制。(偽喚醒的情況:直接使用pthread_cond_broadcast喚醒所有的生產線程,但是此時只能有一個線程拿到鎖,其他線程蘇醒了但是還在等待鎖,如果使用if判斷滿的話如果下一次鎖還是被生產者拿到,此時隊列還是滿的,但是接拿到鎖的線程還會繼續插入發生錯誤,使用while就是為了在偽喚醒以后多加一次判斷,如果條件沒有達到繼續進入條件等待。)
? 1.6為什么 pthread_cond_wait 需要互斥量?
? 1.7條件變量的封裝
2.POSIX信號量
? POSIX信號量和SystemV信號量作?相同,都是?于同步操作,達到?沖突的訪問共享資源?的,但POSIX可以?于線程間同步。
#include <semaphore.h>int sem_init(sem_t *sem, int pshared, unsigned int value);參數:pshared:0表?線程間共享,?零表?進程間共享value:信號量初始值
int sem_destroy(sem_t *sem);
功能:等待信號量,會將信號量的值減1int sem_wait(sem_t *sem); //P()
功能:發布信號量,表?資源使?完畢,可以歸還資源了。將信號量值加1。int sem_post(sem_t *sem);//V()
2.2基于環形隊列的?產消費模型
環形隊列的?產消費模型代碼示例:
Sem封裝
RingBuffer.hpp
? 這里將Mutex和封裝好的Sem都應用了,需要查看具體及測試代碼的同學可以在我的gitee倉庫下的RingBuffer文件夾獲取,該項目單生產單消費以及多生產多消費都是支持的,生產與消費之間是并發的,相較于阻塞隊列生產者消費者模型提高了效率。
我的gitee倉庫https://gitee.com/toutie40/study_code.git
本文到此結束,感謝大家觀看,希望對你有所幫助,有錯誤請多多指教。