執行緒的生產者消費者模型

2021-08-02 11:59:12 字數 1649 閱讀 8558

生產者—消費者模型的321原則:

3種關係:

生產者-生產者 ***互斥***

消費者-消費者 ***互斥***

生產者-消費者 ***互斥,同步***

2種角色:

消費者 生產者
1個交易場所:

臨界資源

實現321的方法:

1個交易場所:建立乙個帶頭節點的鍊錶:

typedef struct _head //結構體宣告

node,*node_p,**node_pp;

node_p head; //頭指標宣告

void initlist(node_pp _h) //初始化帶頭節點鍊錶

void pushfrond(node_p _h,int k)//

node_p popfrond(node_p _h)

兩個角色:我們需要建立兩個執行緒:

void *consume(void *arg) // 用於消費,即呼叫popfrond

void &product(void *arg) //用於生產,即呼叫pushfrond

互斥:函式consume與product不能執行臨界區,即消費者,生產者不能同時訪問臨界資源(不能同時改變鍊錶head):

我們可以用互斥鎖

pthread_mutex_t mutex_lock = pthread_mutex_initializer;

pthread_mutex_lock(&mutex_lock);//加鎖

pthread_mutex_unlock(&mutex_lock);//解鎖

同步:消費者不能超過生產者消費,當消費者發現沒有資源時,就掛起等待,當生產者放入資源後傳送訊號喚醒消費者消費;

可以用條件變數即同時滿足同步:

pthread_cond_t  cond = pthread_cond_initializer; 

pthread_cond_wait(&cond,&mutex_lock);//等待

pthread_cond_signal(&cond);//發訊號

訊號的功能:

1.釋放鎖 //讓其他執行緒訪問臨界區

2. 阻塞等待/

3. 喚醒時重新獲得鎖

消費者-生產者模型編寫:

void

* product(void

*arg)

return

null;

}void

*consum(void

*arg)

printf("consum done! %d\n",tmp->

data);

pthread_mutex_unlock(&mutex_lock);//解鎖

}return

null;

}

執行緒,生產者消費者模型

什麼是執行緒 1.執行緒是cpu最小的執行單位 2.程序是資源單位 3.如果將作業系統比作工廠的話,程序是車間,執行緒是流水線,而cpu為電源 開啟乙個程序預設有乙個執行緒即主線程 執行緒的兩種開啟方式 例項化thread類 自定義mythread類,繼承thread類,覆蓋run方法 什麼時候需要...

生產者消費者模型

1.生產者消費者問題 producer consumer 有限緩衝,多執行緒同步。生產者執行緒和消費者執行緒共享固定大小緩衝區。2.關鍵是保證生產者不會再緩衝區滿時加入資料,消費者不會在緩衝區空時消耗資料。3.解決辦法 讓生產者在緩衝區滿時休眠,等下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒...

生產者消費者模型

生產者與消費者 3,2,1 三種關係 生產者與消費者 互斥,同步 消費者與消費者 互斥 生產者與生產者 互斥 條件變數 int pthread cond destroy pthread cond t cond int pthread cond init pthread cond t restrict...