信号量解决进程同步互斥习题

独木桥问题

一个主修动物行为学、辅修计算机科学的学生参加了一个课题,调查花果山的猴子是否能被教会理解死锁。他找到一处峡谷,横跨峡谷拉了一根绳索(假设为南北方向)这样猴子就可以攀着绳索越过峡谷。只要它们朝着相同的方向,同一时刻可以有多只猴子通过。但是如果在相反的方向上同时有猴子通过则会发生死锁(这些猴子将被卡在绳索中间,假设这些猴子无法在绳索上从另一只猴子身上翻过去)。如果一只猴子想越过峡谷,它必须看当前是否有别的猴子在逆向通过。请使用P/V 操作来解决该问题。

semaphore bridge,Smutex,Nmutex;
int count;//表示在桥上过桥的数量
bridge.value=1;//桥是临界资源,为表示不同方向互斥访问
Smutex.value=1;//count是临界资源,往南走的进程使用时得保护临界区
Nmutex.value=1;//count是临界资源,往北走的进程使用时得保护临界区
count=0;//初始时过桥的猴子数量为0
cobegin
	//往南方向走的猴子进程
	procedure South()
	{
		wait(Smutex);//保护临界区
		if(count==0)
			wait(bridge);//封锁桥,不让反方向的进入桥
		count++;
		signal(Smutex);//保护临界区
		...
		go through the bridge
		...
		wait(Smutex);//保护临界区
		count--;
		if(count==0)
			signal(bridge);	//本方向的猴子走完了,释放桥
		signal(Smutex);//保护临界区
	}
	//往北方向走的猴子进程
	procedure North()
	{
		wait(Nmutex);//保护临界区
		if(count==0)
			wait(bridge);//封锁桥,不让反方向的进入桥
		count++;
		signal(Nmutex);//保护临界区
		...
		go through the bridge
		...
		wait(Nmutex);//保护临界区
		count--;
		if(count==0)
			signal(bridge);	//本方向的猴子走完了,释放桥
		signal(Nmutex);//保护临界区
	}
coend

苹果橘子问题

桌子上只有一个盘子,每次只能放入一种水果;爸爸专门向盘子里放入苹果,妈妈专门向盘子里放入橘子,一个儿子专吃盘子中的橘子,一个女儿专吃盘子中的苹果;试用信号量机制解决进程的互斥同步问题

//这里分析,对于father和mother而言,盘子是临界资源,同一时刻只能有一个往盘子里放水果
//对于mother和son而言,存在着同步关系,mother放完orange等着son吃,son吃完等着mother放
//同理,对于father和daughter而言,存在同步关系
//这里定义五个信号量,plate表示盘子是互斥的
//m,s用来表示mother和son交叉唤醒
//f,d用来表示father和daughter交叉唤醒
semaphore plate,m,s,f,d;
plate.value=1;
m.value=f.value=1;
s.value=d.value=0;
cobegin
procedure father()
{
	while(1)
	{
		wait(plate);//判断盘子是否可用,锁定盘子
		wait(f);//有点奇怪,感觉f在这里很鸡肋
		...
		put  an apple into plate
		...
		signal(d);//通知daughter有apple可吃
		signal(plate);//释放盘子
	}
}
procedure mother()
{
	while(1)
	{
		wait(plate);//锁定盘子
		wait(m);//有点奇怪,感觉m在这里很鸡肋
		...
		put an orange into plate
		...
		signal(s);//通知son可以吃orange
		signal(plate);//释放盘子
	}
}
procedure son()
{
	while(1)
	{
		wait(s);//等待mother放好orange
		...
		get an orange from plate to eat
		...
		signal(m);//通知mother继续放
	}
}
procedure daughter()
{
	while(1)
	{
		wait(d);//等待father放好apple
		...
		get an apple from plate to eat
		...
		signal(f);//通知father继续放
	}
}
coend

快餐厅问题

一个快餐厅有四类职员
(1)领班:接受顾客点菜
(2)厨师:准备顾客的饭菜
(3)打包工:将做好的饭菜打包
(4)出纳员:收款并提交食品
每个职员可以被看作一个进程,请用信号量机制解决进程互斥同步问题

//P1->P2->P3->P4->P1这是一个同步问题
//定义四个信号量S1,S2,S3,S4
semaphore S1,S2,S3,S4;
S1.value=1;
S2.value=S3.value=S4.value=0;
cobegin
procedure P1
{
	wait(S1);
	...
	接受顾客点菜
	...
	signal(S2);
}
procedure P2
{
	wait(S2);
	...
	准备顾客的饭菜
	...
	signal(S3);
}
procedure P3
{
	wait(S3);
	...
	将做好的饭菜打包
	...
	signal(S4);
}
procedure P4
{
	wait(S4);
	...
	收款并提交食品
	...
	signal(S1);
}
coend
发布了97 篇原创文章 · 获赞 101 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/practical_sharp/article/details/102769841