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

2021-08-19 23:23:19 字數 2072 閱讀 5573

在linxu的多執行緒機制中,由於可能同時對臨界資源進行讀寫操作,因此互斥鎖經常被用來進行互斥操作。

初次之外訊號量和環形佇列等互斥機制則使用起來更為簡單。

#include#include#include#include#define size 1024

//環形佇列

int arr[size] = ;

sem_t sem_pro; //描述環形佇列中的空位置

sem_t sem_con; //描述喚醒佇列中的資料

//生產者,只要環形佇列有空位,便不斷生產

void*productor(void*arg)

}//消費者,只要環形佇列中有資料,就不斷消費

void*consumer(void*arg)}

int main()

佇列具有天然的互斥特性,被廣泛地應用到linux核心 和python中,可以建立工作佇列。另一篇部落格  管道的環形設計方法

有詳細的介紹。

在隊列為空時,生產者必須先執行,消費者不能越過生產者

在隊列為滿時,消費者先執行,生產者不能超過消費者一圈,

不能同時訪問同一位置:

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

建立全域性陣列 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;

}

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

1.環形佇列 在隊列為空時,生產者必須先執行,消費者不能越過生產者 在隊列為滿時,消費者先執行,生產者不能超過消費者一圈,不能同時訪問同一位置 2.訊號量sem t sem posix的執行緒標準下的 訊號量機制通過訊號量的值控制可用資源的數量。執行緒訪問共享資源前,需要申請獲取乙個訊號量,如果訊號...

基於鍊錶和環形佇列的生產者消費者模型

在學習系統程式設計當中,有一種很重要的模型,那就是生產者消費者模型,在編寫多執行緒 時候,乙個個執行緒就扮演著生產者,消費者的角色。舉乙個例子,在生活中,我們去商店買東西,那麼我們相當於消費者,而貨物生成廠家就是生產者,商店扮演著交易場所。我們總結為 生產者和生產者 這些廠商在生產貨物的時候,加入都...

基於佇列實現生產者消費者模型

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