設有三個進程A、B、C,其中A與B構成一對生產者與消費者(A為生產者,B為消費者),共享一個由n個緩沖塊組成的緩沖池;B與C也構成一對生產者與消費者(此時B為生產者,C為消費者)共享另一個由m個緩沖塊組成的緩沖池。用P、V操作描述它們之間的同步關系。


生產者消費者問題
設信號量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三個進程並發執行
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM