1 吃水果问题:
桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等待吃盘子中的苹果。
请用信号量及PV操作来实现爸爸、妈妈、儿子和女儿之间的同步与互斥关系。
{ //初始化
apple = 0; 标识盘中苹果的个数
orange = 0; 标识盘中橘子的个数
metux = 1; 标识盘子的互斥操作
empty = 2; 标识盘子的容量
}
father(){
P(empty); 盘子有空位则占去一个,否则等待(先检查同步对象,再检查互斥对象)
P(mutex); 等待互斥对象
爸爸放入一个苹果;
V(mutex); 释放互斥对象
V(apple); 增加苹果数量
}
mother(){
P(empty); 盘子有空位则占去一个,否则等待
P(mutex); 等待互斥对象
妈妈放入一个橘子;
V(mutex); 释放互斥对象
V(orange); 增加橘子数量
}
son1(){
P(orange); 检查盘中有无橘子
P(mutex); 等待互斥对象
儿子1拿一个橘子;
V(mutex); 释放互斥对象
V(empty); 盘子多出一个空位
}
son2{
P(orange);
P(mutex);
儿子2拿一个橘子;
V(mutex);
V(empty);
}
daughter1(){
P(apple); 检查盘中有无苹果
P(mutex); 等待互斥对象
女儿1拿一个苹果;
V(mutex); 释放互斥对象
V(empty); 盘子多出一个空位
}
daughter2(){
P(apple);
P(mutex);
女儿2拿一个苹果;
V(mutex);
V(empty);
}
main(){
cobegin
father(); mother(); son1(); son2(); daughter1(); daughter2();
coend
}
2 理发师问题:
一个理发店有N张沙发接待顾客,有P位理发师(N>P)。顾客到来时,如果还有空沙发,新到的顾客就坐在沙发上;如果没有空沙发,就离开。空闲的理发师为顾客理发;若理发师都在理发,顾客则需等待。
试用信号量及PV操作实现理发师给顾客理发的问题。
{//初始化
sofa = N; 空沙发的数量(变量)
barber = P; 理发师的数量(信号量)
customer = 0; 等待中的顾客数量(信号量)
sofa_mutex = 1; 访问空闲sofa数量的(互斥信号量)
}
barber(){
P(customer); 判断有无顾客在等待中
P(barber); 判断是否有理发师正空闲
安排一名理发师给顾客理发;
V(barber); 理发完毕,一名理发师空闲
P(sofa_mutex); 要锁定访问空闲沙发数量
sofa++; 空闲沙发数量++
V(sofa_mutex); 释放
}
custom(){
P(sofa_mutex); 申请锁定访问空闲沙发数量
if(sofa > 0){ //如果还有空沙发
V(sofa_mutex); 释放
V(customer); 等待的顾客数量++
P(barber) ;判断有无空闲理发师
安排一名理发师给顾客理发;
}
else{
V(sofa_mutex);
顾客离开;
}
}
main(){
cobegin
barber(); custom();
coend
}