1. 環形佇列
2. 訊號量在隊列為空時,生產者必須先執行,消費者不能越過生產者
在隊列為滿時,消費者先執行,生產者不能超過消費者一圈,
不能同時訪問同一位置:
sem_t sem;//posix的執行緒標準下的
訊號量機制通過訊號量的值控制可用資源的數量。執行緒訪問共享資源前,需要申請獲取乙個訊號量,如果訊號量為0,說明當前無可用的資源,執行緒無法獲取訊號量,則該執行緒會等待其他資源釋放訊號量(訊號量加1)。如果訊號量不為0,說明當前有可用的資源,此時執行緒占用乙個資源,對應訊號量減1。
舉例:停車場有5個停車位,汽車可使用停車位。在這裡5個停車位是共享的資源,汽車是執行緒。開始訊號量為5,表明此時有5個停車位可用。一輛汽車進入停車場前,先查詢訊號量的值,不為0表明有可用停車位,汽車進入停車場並使用乙個停車位,訊號量減1,表明占用乙個停車位,可用數減少。
訊號量初始化函式:
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem: 訊號量
pshared:引數表示這個訊號量是否在程序的執行緒之間共享程序之間
value:初始值
nt sem_wait(sem_t *sem);
該函式申請乙個訊號量,當前無可用訊號量則等待,有可用訊號量時占用乙個訊號量,對訊號量的值減1。
訊號量加1:
int sem_post(sem_t *sem);
該函式釋放乙個訊號量,訊號量的值加1。
銷毀訊號量:
int sem_destory(sem_t *sem);
該函式銷毀訊號量。
3.臨界資源sem_init(&blanksem, 0, size);//初始化
sem_init(&datasem, 0, 0);
建立全域性陣列 int ring[size] = 0;
![](https://pic.w3help.cc/503/cafa2b0d1007d0aea2724c8d37f64.jpeg)
這樣訊號量不僅可以實現生產者與消費者的同步
,而且可以實現互斥
(兩者不可能同時訪問同一資源);
void* product(void *arg)//生產者
return null;
}void* consume(void *arg) //消費者
}
訊號量只能實現生產者與消費者之間的·互斥·同步·
現在多生產者和消費者,所以需要加入,互斥鎖實現生產者與生產者之間的互斥,消費者與消費者之間的互斥;
int i = 0;
int n = 0;
int data = 0;
void* product_1(void *arg)//生產者1
return
null;
}void* product_2(void *arg)//生產者2
return
null;
}void* consume_1(void *arg)//消費者1
return
null;
}void* consume_2(void *arg)//消費者2
return
null;
}
基於環形佇列的的生產者消費者模型
在linxu的多執行緒機制中,由於可能同時對臨界資源進行讀寫操作,因此互斥鎖經常被用來進行互斥操作。初次之外訊號量和環形佇列等互斥機制則使用起來更為簡單。include include include include define size 1024 環形佇列 int arr size sem t ...
佇列,生產者消費者模型
from multiprocessing import process,lock import os,time,json with open user w encoding utf 8 as f dic json.dump dic,f def search with open user r enco...
基於佇列實現生產者消費者模型
code from multiprocessing import process,queue import time,random,os def consumer q,p1 while true res q.get if res finish break time.sleep random.rand...