进程的互斥控制_卡车装水问题

题目:
两个装水工人并发的向卡车装水,一次装一箱,每辆卡车装满20箱即开走.试用基础信号量和普通变量实现10辆卡车装水的伪代码.
实现:

信号量的设置:
名称		 初值		含义
part         1			车位数
mutex        1			控制工人装水操作的完整性
empty        0			当前卡车还能装多少箱水
go           0			当前装满水的卡车数

//卡车线程
void car()	{
	wait(part);		//排队进入车位
	for(int i=0;i<20;i++)		//进入后释放箱子空位
		signal(empty);
	wait(go);			//等待装满水离开
	//离开车位
	signal(part);
}
//工人线程
void worker(){
	while(1)
	{
		wait(empty);
		wait(mutex);
		//装水操作
		water++;
		//相对于加在最后,信号量的获取与释放仅加在临界区才能保证程序良好的并发性
		signal(mutex);
		wait(judge);		//判断是否装满,这里加信号量是为了防止两个工人同时进入if并释放go
		if(water==20)
		{
			water=0;
			signal(go);
		}
		signal(judge);
	}

//main
int main(){
for(int i=0;i<10;i++)
	car();		//启动十个车线程
worker();
worker();		启动两个搬运工人线程
}

总结:
①.当遇到互斥控制的题目时,首先分析在哪里需要互斥控制,顺序控制来决定信号量的个数,并确定临界区的范围.
在本题中:
1.车位只有一个,车有十辆,此处需要互斥.而当车走后,车位才会被释放(part)
2.每车只能装20箱,为了防止两个工人多装,重复装,则装箱操作需要互斥(empty)
3.对于箱数的自增变化需要互斥(mutex)
4.如何让车在装满水之前等待? 可以用wait(go)来阻塞它,让工人在装满水之后发出离开信号signal(go).
②.当确定信号量都是什么之后,根据语义来定义其初始值
1.只有装满一辆车后才开走,在此之前只往这辆车里装,车位数可知为1
2.每车可装20箱,则empty在卡车进入时增加20,初值为0,每个装水工装水之前申请一个空位.
3.操作互斥变量的信号量mutex初值置为1
4.车刚到肯定不能走,go信号量初值为0,由工人来控制何时离开,建立两进程间的关系.
③.根据信号量的意义及范围来在合适的位置释放资源.如果过早会造成控制的失效,但更多数情况下需要注意的是过晚释放资源,此时虽然不会造成严重的错误,但是会使整个程序的并发性降低,并影响程序效率.

猜你喜欢

转载自blog.csdn.net/qq_39560579/article/details/82850649