1. 程式人生 > >作業系統生產者消費者問題偽C++解決方案

作業系統生產者消費者問題偽C++解決方案

#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環境執行結果: