c語言實現生產者與消費者

2021-10-06 16:26:07 字數 1626 閱讀 9440

問題描述:

有多個程序:多個生產者程序和多個消費者程序共享乙個初始為空、固定大小為n的快取(緩衝區)。生產者的工作是製造資料,只有緩衝區沒滿時,生產者才能把訊息放入到緩衝區,否則必須等待; 同時,只有緩衝區不空時,消費者才能從中取出訊息,一次消費一段資料(即將其從快取中移出),否則必須等待。由於緩衝區是臨界資源,它只允許乙個生產者放入訊息,或者乙個消費者從中取出訊息,同時只允許乙個生產者進行製造,多個生產者不能同時製造,也只允許乙個消費之進行消費,多個消費者不能同時進行消費。

主要問題:

當緩衝為空的時候,消費者不能消費,必須等待

當快取為滿的時候,生產者不能生產,必須等待

生產者消費者之間必須互斥

實現思路:

設定三個訊號量:empty (以記錄有多少空位)、full (以記錄有多少滿位)以及mutex

(二進位制訊號量或互斥訊號量,以保護對緩衝插入與刪除的操作)

當訊號量empty為0的時候,此時有限快取已滿,生產者必須等待,當訊號量full為0的時候,此時有限快取為空,消費者無法進行消費,必須等待

訊號量mutex使得各個執行緒之間互斥,每次只允許乙個執行緒進入臨界區,一旦有執行緒進入自己的臨界區,其餘執行緒必須等待

有限快取區為迴圈佇列,尾部插入新的產品,頭部產品先被消耗

# include # include # include # include # include # include # include # include #define buffer_size 5

typedef int buffer_item;

//semaphores

sem_t empty, full, mutex;

//buffer

buffer_item buffer[buffer_size];

int in, out;

//儲存資料的結構體

struct data ;

//有限快取插入--生產

int insert_item(buffer_item item)

//有限快取刪除--消費

int remove_item(buffer_item *item)

//生產者

void *producer(void* param)

//消費者

void *consumer(void* param)

int main()

else if(role == 'c')

pthread_create(&tid, &attr, consumer, d);

}//釋放訊號量

sem_destroy(&mutex);

sem_destroy(&empty);

sem_destroy(&full);

return 0;

}

測試:

測試資料:

1 c 3 5

2 p 4 5 1

3 c 5 2

4 c 6 5

5 p 7 3 2

6 p 8 4 3

輸出結果:

生產者與消費者問題C語言實現

實驗目的 實現生產者 消費者問題的模擬,以便更好的理解此經典程序同步問題。生產者 消費者問題是典型的pv操作問題,假設系統中有乙個比較大的緩衝池,生產者的任務是只要緩衝池未滿就可以將生產出的產品放入其中,而消費者的任務是只要緩衝池未空就可以從緩衝池中拿走產品。緩衝池被占用時,任何程序都不能訪問。每乙...

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

GO語言實現生產者消費者模型

一 只使用channel實現package main import fmt math rand sync time 生產者函式 func producter index int ch chan int 消費者函式 func consumer index int ch chan int func ma...