现用wait和signal操作写出能同步执行的程序。
农户和动物园仿照读者-写者关系,为实现Reader与Writer进程间在读或写时的互斥而设置了一个互斥信号量wmutex。另外,再设置一个整型变量pigcount表示正在读的进程个数。又因为pigcount是一个可被多个Reader进程访问的临界资源,因此,为它设置一个互斥信号量rmutex。
Semaphore mutex=1,rmutex=1,wmutex=1; //互斥资源
Swmaphore 猪=0,虎=0;
int pigcount=0; //放入猪的数量
void 农户(){
while(1){
wait(rmutex);
if(pigcount==0) wait(wmutex); //第一个饲养员封锁放虎权
pigcount++;
signal(rmutex); //前四句控制放猪的农户有序排队进入
wait(mutex);
放猪;
signal(mutex);
signal(猪); //后四句执行放猪操作
}
}
void 猎人(){
while(1){
wait(wmutex); //争夺放虎权
wait(mutex);
放虎;
signal(mutex);
signal(虎);
}
}
void 厨师(){
while(1){
wait(猪);
wait(mutex);
取一头猪;
signal(mutex);
wait(rmutex);
pigcount--;
if(pigcount==0) signal(wmutex); //最后一位厨师释放放虎权
signal(rmutex);
}
}
void 动物园(){
while(1){
wait(虎);
wait(mutex);
取出老虎;
signal(mutex);
signal(wmutex); //释放放虎权
}
}