【正确答案】[解答] 设信号量mutex用于车间的互斥,positionA、positionB和partA,partB为资源信号量,分别表示仓库中零件甲、乙的空位数和满位数,positionA+partA=m;positionB+partB=n;以下编程:
deftype int semaphore; //定义信号量
semaphore mutex=1; //进入仓库的互斥信号量
semaphore positionA=m,positionB=n; //车间A、B生产的零件甲、乙存放的位置
semaphore partA=0,partB=0; //零件甲、乙的信号量
void workshopA() //车间A进程
{ while(TRUE) //并发调度
{ int item; //仓库货架指针
item=produce(甲); //生产零件甲
P(positionA); //查有无零件甲的货位
P(mutex); //仓库可以进入吗?
puton(item); //放置零件甲
V(mutex); //释放仓库互斥量
V(partA); //增加零件甲的资源信号量
} //离开
}
void workshopB() //车间B进程
{ while(TRUE) //并发调度
{ int item; //仓库货架指针
item=produce(乙); //生产零件乙
P(positionB); //查有无零件乙的货位
P(mutex); //仓库可以进入吗?
puton(item); //放置零件乙
V(mutex); //释放仓库互斥量
V(partB); //增加零件乙的资源信号量
} //离开
}
void assembleshop() //总装车间进程
{ while(TRUE) //并发调度
{ int item1,item2; //仓库货架指针
P(partA); //查第一个零件甲是否有?
P(partA); //查第二个零件甲是否有?
P(partB); //查第一个零件乙是否有?
P(mutex); //仓库可以进入吗?
item1=get(甲,2); //取出2个零件甲
item2=get(乙); //取出1个零件乙
V(mutex); //释放仓库互斥量
V(positionA); //增加零件甲的第一空位信号量
V(positionA); //增加零件甲的第二空位信号量
V(positionB); //增加零件乙的空位信号量
assemble(item1,item2); //总装
} //离开
}
【答案解析】[解析] 本题考查的是生产者和消费者问题的变形。本题中的生产者有两个,所对应的缓冲区(即仓库)是一个,但是,它们各自有自己的零件货位,甲、乙零件可以分别存放m、n件,所以可以考虑设置一个仓库的互斥量,作为车间A、B和总装车间的互斥信号量。由于已知甲、乙货架的数量分别为m、n,因此可以为车间A、B设置资源信号量positionA、positionB,它们的初值分别为m、n,表示货架为空、可以分别存放的零件数量。对于总装车间来讲,它是一个消费者,与普通消费者不同的是,它每次要取零件甲2件和零件乙1件来生产,因此可以设置资源信号量partA和partB,它们的初值为0,代表仓库中零件甲、乙的数量。总装车间每次消费2个零件甲,可以对信号量partA作2次P操作,消费零件乙1件则只作1次P操作,从而完成三个车间的同步。