linux生產者與消費者
『壹』 【Linux】POSIX信號量詳解,從原理認識到代碼實現線程間通信
POSIX信號量提供兩種類型:有名信號量與無名信號量。它們實質上都是計數器加上PCB等待隊列,以及一系列介面(等待與喚醒介面)。
有名信號量允許通過名字打開共享同一個信號量的多個獨立進程,實現同步操作。這比無名信號量更方便,適用范圍更廣。有名信號量的創建與關閉機制包括通過sem_open函數創建時可能返回SEM_FAILED並設置errno,以及調用sem_close終止關聯關系並減少引用計數。
進程終止時,自動關閉已打開的有名信號量。當進程執行exec系列函數時,同樣會自動關閉有名信號量。關閉操作不等同於刪除。有名信號量的刪除需通過sem_unlink函數,同時需注意系統維護的引用計數,只有所有打開該信號量的進程都關閉後才會真正刪除。
無名信號量沒有名字,適用范圍較窄,主要用於線程間同步,因線程共享地址空間。其生命周期有限,線程組退出後無名信號量消失,對於進程間共享的信號量則取決於共享內存的持久性。
無名信號量初始化後,可像操作有名信號量一樣進行操作。無名信號量的銷毀需調用sem_destroy,確保所有進程不再等待信號量後方可安全執行銷毀操作。
信號量用於資源管理,創建時的value值代表資源初始數量。申請資源時調用sem_wait減計數,使用完畢或發布資源時調用sem_post加計數。sem_wait嘗試減計數,若成功立刻返回,否則根據當前值返回失敗或超時錯誤。sem_post加計數,若當前值為0且有等待進程則喚醒一個進程繼續減計數操作。
有名與無名信號量均可用於實現互斥與同步。互斥時,計數器值為負表示等待隊列中有多少個執行流在等待。無名信號量實現生產者與消費者模型的代碼實例展示了如何更改資源數量與線程數量以適應不同場景。