是一種進程間或線程間同步機制,用于控制多個線程/進程對共享資源的訪問,避免并發沖突。可以看作是一個計數器,通過對計數器的操作(PV操作)實現同步
P操作(原子性):--,將信號量的值-1,對應等待資源,若資源不足則阻塞
V操作:++,將信號量的值+1,對應釋放資源,若有等待的進程/線程則喚醒
信號量本質也是臨界資源
初始化信號量:sem_init
銷毀信號量:sem_destory
等待信號量:int sem_wait? //p()
發布信號量:int sem_post? //V()
資源可以拆分,可以考慮sem。整體使用,使用mutex
環形隊列
把普通隊列的首尾相連,形成一個環,起始狀態和結束狀態都是一樣的
信號量來保證這四個約定
約定1:為空時,生產者先運行
約定2:為滿時,消費者先運行
約定3:生產者不能把消費者超過一個圈以上,可以理解成數據超過了容量,再輸入數據就覆蓋了,這樣是不可行的
約定4:消費者不能超過生產者我們可以理解成警察追小偷,但是超過就就不合理了
1. 只要我們不訪問同一個位置,我們就可以同時運行
2. 為空或者為滿的時候,我們會在同一個位置
3. 為空:只能[互斥],生產者先[同步]運行
????為滿:只能[互斥],消費者先[同步]運行
結論1:環形隊列,不為空&&不為滿,生產消費可以同時進行
結論2:環形隊列,為空||為滿,生產和消費,需要同步互斥
基于環形隊列的生產者消費模型