生產者消費者問題

2021-08-21 05:17:34 字數 1951 閱讀 1575

1.生產者消費者簡單程式

#include

#include

#include

#include

#include

#define max_stock 20//倉庫容量

char g_storage[max_stock];

size_t g_stock=0;//當前庫存

//互斥量

pthread_mutex_t g_mtx=pthread_mutex_initializer;

//條件變數

pthread_cond_t g_full=pthread_cond_initializer;//滿倉   條件變數

pthread_cond_t g_empty=pthread_cond_initializer;//空倉

//顯示庫存

void show(const char*who,const char*op,char prod)   

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

show(who,"<-",prod);

g_storage[g_stock++]=prod;

pthread_cond_signal(&g_empty);

pthread_mutex_unlock(&g_mtx);

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

return null; }

//消費者執行緒

void*customer(void*arg)

char prod=g_storage[--g_stock];

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

pthread_cond_signal(&g_full);//即使沒有等待的執行緒也返回成功

pthread_mutex_unlock(&g_mtx);

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

return null; }

int main()

2.說明:

**pthread_cond_wait 執行的流程首先將這個mutex解鎖, 然後等待條件變數被喚醒, 如果沒有被喚醒, 該執行緒將一直休眠, 也就是說, 該執行緒將一直阻塞在

這個pthread_cond_wait呼叫中, 而當此執行緒被喚醒時, 將自動將這個mutex加鎖,然後再進行條件變數判斷(原因是「驚群效應」,如果是多個執行緒都在等待

這個條件,而同時只能有乙個執行緒進行處理,此時就必須要再次條件判斷,以使只有乙個執行緒進入臨界區處理。),如果滿足,則執行緒繼續執行,最後解鎖,

也就是說pthread_cond_wait實際上可以看作是以下幾個動作的合體:

1.解鎖執行緒鎖

2.等待執行緒喚醒,並且條件為true加鎖執行緒鎖.

**pthread_cond_signal僅僅負責喚醒正在阻塞在同一條件變數上的乙個執行緒,如果存在多個執行緒,系統自動根據排程策略決定喚醒其中的乙個執行緒,在多處理

器上,該函式是可能同時喚醒多個執行緒,同時該函式與鎖操作無關,解鎖是由pthread_mutex_unlock(&mutex)完成

**喚醒丟失問題 

喚醒丟失往往會在下面的情況下發生:

乙個執行緒呼叫pthread_cond_signal或pthread_cond_broadcast函式; 

另乙個執行緒正處在測試條件變數和呼叫pthread_cond_wait函式之間; 

沒有執行緒正在處在阻塞等待的狀態下。

3.小結:

生產者消費者之間是通過互斥量和條件變數的結合來完成的(本例沒有用多個生產者消費者)。我們的互斥量(鎖)以及執行緒的訊號量是用來控制同步也就是臨界資源只能由乙個執行緒去使用。但是生產消費關係比同步要稍複雜一點,它不僅要考慮到同步更要考慮到臨界資源是否可以生產或者消費這就必須要使用條件變數,在臨街資源不能為進來的資源提供服務的情況下及時釋放進來這個執行緒拿到的鎖以保證不會產生死鎖。

生產者消費者問題

public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...

生產者 消費者問題

在學習程序互斥中,有個著名的問題 生產者 消費者問題。這個問題是乙個標準的 著名的同時性程式設計問題的集合 乙個有限緩衝區和兩類執行緒,它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必 須等待...

生產者 消費者問題

1 程序互斥問題 緩衝區b是臨界資源,程序p和c不能同時對b進行操作,即只能互斥的操作 2 程序同步問題 p不能往 滿 的的緩衝區b放產品,c不能從空的緩衝區獲得產品。當緩衝區滿時,c必須先於p執行,當緩衝區空時,p必須先於c執行 我們給出如下基於記錄型 二元 訊號量機制的解法 10 9 2013 ...