設有三個進程A、B、C,其中A與B構成一對生產者與消費者(A爲生產者,B爲消費者),共享一個由n個緩衝塊組成的緩衝池;B與C也構成一對生產者與消費者(此時B爲生產者,C爲消費者)共享另外一個由m個...

生產者消費者問題
設信號量mutex1, mutex2, full1, full2, empty1, empty2分別表示1和2號緩衝區的訪問互斥, 是否滿, 是否空
semaphore mutex1 = 1, empty1 = n, full1 = 0;
semaphore mutex2 = 1, empty2 = m, full2 = 0; 
void A()//向緩衝池1添加商品
{
	while(1)
	{
		produce next product1;
		p(empty1);//檢測當前緩衝池是否爲空,若是爲空(說明我A須要向裏面放東西了),則進行下一步,不然,阻塞本進程
		p(mutex1);//檢測是否能夠進入緩衝區(即檢測緩衝區中是否有其餘進程),若能夠則本身進去並鎖上門,不然,阻塞本進程
			buffer1(i) = product1;//將商品放入緩衝區1
			i = (i + 1) % n;//緩衝隊列的尾指針後移
		v(mutex1);//放完商品,離開緩衝區,釋放互斥訪問鎖,容許其餘進程進入
		v(full1);//通知進程B,我已放好商品,你能夠來取了
	}
}

void B()//從緩衝區1中取出商品,放到緩衝區2
{
	while(1)
	{
		p(full1);// 先檢測緩衝區1內是否有貨
		p(mutex1);// 有貨,再檢測緩衝區1是否有其餘進程正在訪問,沒有的話,本身進去並鎖上門
			goods = buffer1(j);//取貨
			j = (j + 1) % n; //緩衝隊列隊首指針後移
		v(mutex1);// 取完貨後,釋放緩衝區1的互斥訪問鎖
		v(empty1);// 提示A我取出貨了,你能夠接着往裏面放了
			Consume goods and Produce next product2;
		p(empty2);// 檢測緩衝區2是否爲空
		p(mutex2);// 檢測當前緩衝區中是否有其餘進程
			buffer2(a) = product2;// 向2號緩衝區放置商品
			a = (a + 1) % m;// 2號緩衝區緩衝隊列隊尾指針後移
		v(mutex2);// 離開緩衝區2,釋放鎖
		v(full2);// 通知C進程能夠來取貨了(我已經放進去商品了,你能夠來取了)
	}
}

void C()
{
	while(1)
	{
		p(full2);// 檢測2號緩衝區內是否有貨
		p(mutex2);//如有貨,加鎖,進入
			goods = buffer2(b);//取出商品
			b = (b + 1) % m;//2號緩衝區隊首指針後移
		v(mutex2);// 離開緩衝區2,釋放鎖
		v(empty2);// 通知B進程,我已經取出商品,你能夠繼續往裏面放了
		Consume product;
	}
}

int main()
{
	parbegin(A(), B(), C());//A,B,C三個進程併發執行
}
相關文章
相關標籤/搜索