C語言之生產者與消費者模型

2022-03-23 11:13:16 字數 1409 閱讀 4487

多執行緒併發應用程式有乙個經典的模型,即生產者/消費者模型。系統中,產生訊息的是生產者,處理訊息的是消費者,消費者和生產者通過乙個緩衝區進行訊息傳遞。生產者產生訊息後提交到緩衝區,然後通知消費者可以從中取出訊息進行處理。消費者處理完資訊後,通知生產者可以繼續提供訊息。

要實現這個模型,關鍵在於消費者和生產者這兩個執行緒進行同步。也就是說:只有緩衝區中有訊息時,消費者才能夠提取訊息;只有訊息已被處理,生產者才能產生訊息提交到緩衝區。

我們用乙個佇列來做這個緩衝區,產生的訊息我們放到這個佇列中去,如果這個佇列滿了,則不放入訊息,我們這個佇列大小是10,能夠存放10條訊息。然後消費者去消費,消費者去這個緩衝區裡去取資料,同樣,如果緩衝區裡沒有資料,那麼就不會消費。

這一模型的核心就是消費者和生產者一起去搶互斥鎖,誰搶到了這個鎖誰就有資格對這個緩衝區進行相關操作。

分析一線程負責生產資料,另一部分執行緒負責消費資料。

問題1:如果產生的塊,消費的慢,生產者容易餓死

問題2:如果生產的慢,消費的快,消費者容易餓死

只有把兩個問題協調好,才能最大限度的提高效率。

**:#include

#include

#include

#include

#define max 20

char storage[max] = {};

int count = 0;

pthread_mutex_t mutex = pthread_mutex_initializer;

pthread_cond_t full = pthread_cond_initializer;

pthread_cond_t empty = pthread_cond_initializer;

void show_storage(char* role,char* op,char prod)

char prod = 'a'+rand()%26;

storage[count++] = prod;

show_storage(who,"->",prod);

pthread_cond_signal(&empty);

pthread_mutex_unlock(&mutex);

usleep(rand()%100*1000);}}

void* con_run(void* arg)

char prod = storage[count--];

show_storage(who,"

pthread_cond_signal(&full);

pthread_mutex_unlock(&mutex);

usleep(rand()%100*1000);}}

int main()

實現:

生產者與消費者模型

先介紹幾個函式 生產消費者模型 二者共享資料value,這裡,生產者是producter,消費者是consumer。生產者負責放物品到value中,消費者使用wait 等待生產者的通知。當得到通知後,消費者取出物品,並且用notify 通知生產者,可以再放下一批物品。例項 package cn.ed...

生產者與消費者模型

如圖 一共有三種關係 生產者與生產者的互斥關係,消費者與消費者的互斥關係,生產者與消費者的互斥且同步關係。兩種角色 生產者 執行緒 與消費者 執行緒 乙個交易場所 倉庫 一段記憶體空間,且可存可取 二 基於單向鍊錶的生產者消費者模型 1 我們這裡用乙個單鏈表當做那段共享記憶體,簡單實現生產者消費者模...

生產者與消費者模型

生產者 消費者模型描述的是有一塊緩衝區作為倉庫,生產者可將產品放入倉庫,消費者可以從倉庫中取出產品,模型圖如下所示 1 三種關係 三種關係分別指的是 消費者和消費者,生產者和生產者,生產者和消費者 其中消費者和消費者,生產者和生產者之間都屬於競爭關係,生產者和消費者之間的關係相當於是一種食物鏈之間的...