linux 生產者與消費者問題

xiaoxiaohai12發表於2020-11-21

生產者與消費者問題(也稱執行緒同步問題)

講到執行緒必然會講到執行緒同步,那什麼是執行緒同步楠?

執行緒同步概念:即當有一個執行緒在對記憶體進行操作時,其他執行緒都不可以對這個記憶體地址進行操作,直到該執行緒完成操作, 其他執行緒才能對該記憶體地址進行操作,而其他執行緒又處於等待狀態,實現執行緒同步的方法有很多,臨界區物件就是其中一種。

生產者消費者模型1(三個互斥量)

在這裡插入圖片描述
這裡主要對執行緒與互斥量做初始化與建立的工作,不瞭解的引數可以使用man … 與檢視幫助文件
在這裡插入圖片描述
這裡是一些標頭檔案與一些需要用到的引數
在這裡插入圖片描述
這裡是生產者的回撥函式,注意一下加鎖的順序與釋放鎖的順序,不然可能會造成死鎖,看的小夥伴注意一下
在這裡插入圖片描述
這裡是消費者的回撥函式,互斥量的順序問題注意一下,鎖的粒度也可以稍微調整,為了方便看資訊,暫時沒有去優化鎖的粒度,在高併發的時候,鎖的粒度越小越好

生產者與消費者模型2(條件變數加互斥鎖)

在這裡插入圖片描述
這裡是互斥量,條件變數的一些初始化操作,只建立了一個生產者執行緒與一個消費者執行緒,回撥函式內部採用迴圈來控制
在這裡插入圖片描述
這裡是生產者的回撥函式,當生產了一個產品,就呼叫pthread_cond_signal去喚醒一個阻塞的消費者執行緒

在這裡插入圖片描述
這塊是消費者的回撥函式,pthread_cond_wait函式在條件滿足的時候會立即釋放它佔有的鎖,因此不會造成死鎖

執行結果

在這裡插入圖片描述
由於我設定了執行緒睡眠(sleep),所以會造成連續的add與remove, 但是這並不影響我們的預期

最後我總結一下,可能我不是很會寫部落格,希望大家不要介意,以後會多多的參考別人的部落格,希望能夠以後能夠講解清除

相關文章