基於環形佇列的生產者消費者模型編寫。

2021-08-02 12:13:50 字數 1755 閱讀 9698

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);

該函式銷毀訊號量。

sem_init(&blanksem, 0, size);//初始化

sem_init(&datasem, 0, 0);

3.臨界資源
建立全域性陣列 int ring[size] = 0;

這樣訊號量不僅可以實現生產者與消費者的同步,而且可以實現互斥(兩者不可能同時訪問同一資源);

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...