生產者—消費者模型的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...