作業系統生產者消費者問題偽C++解決方案
阿新 • • 發佈:2019-01-24
#include<iostream> #include<malloc.h> #include<stdlib.h> using namespace std; typedef struct{ int *base; int *top; int stacksize; }sqstack; int init(sqstack &S) { S.base = (int *)malloc(100 *sizeof(int)); if (!S.base) exit(0); S.top = S.base; S.stacksize = 100; } void push(sqstack &S, int e,int x) { if (S.top - S.base >= S.stacksize) cout << "無法生產,貨架已滿\n" << endl; else { cout << x << "號生產了一個產品" << endl; *S.top++ = e; } } void pop(sqstack &S,int x) { if (S.top == S.base) cout<<"無法消費,貨架已空\n"<<endl; else { --S.top; cout << x << "號消費了一個產品," <<"當前剩餘產品數:" << S.top - S.base << endl; } } int main() { int i=0,x,j; sqstack s; init(s); cout << "輸入一個隨機數種子" << endl; cin >> j; srand(j); while (i<100) { x = 0 + rand() % 100; if (x > 50) push(s, 1, x); if (x <= 50) pop(s, x); i++; } system("pause"); return 0; }
用棧的push操作模擬生產者生產一件產品的過程,pop操作模擬消費者取走產品的過程。
在程式開始執行後,迴圈中每次生成一個0-100的隨機數決定下一次是生產者進行生產還是消費者進行消費(該隨機數大於50則生產者去生產,小於等於50則消費者去消費者。生產消費的出現概率基本相同,所以很可能出現剩餘產品為0的情況,基本不會出現貨架已滿的情況)
因此,生產者消費者始終互斥使用貨架,故不存在競爭,也就不需要用互斥訊號量mutex,所以只能算偽生產者消費者。linux環境執行結果: