第二章测试题

1.多个生产者和消费者,共享一个能存放100个产品的环形缓冲区(初始为空)。缓冲区未满生产者可放入一个产品,否则等待。要求每个消费者连续取10件产品才能让其他消费者取。请用信号量机制写伪代码实现进程的互斥和同步实现,要求说明所用信号量含义和初值。

int in=0,out=0,n=100;
 semaphore 
   mutex=1;
   full=0;
   rmutex=1;
   empty=100;
   
 item buffer[n];
 
 void main() {
  Producer();
  Consumer();
 }
 
 void Producer() {                    //生产者代码和经典问题相比并无变化
  do {
   producer an item nextp;
   ...
   wait(empty);
   wait(mutex);
   buffer[in]=nextp;
   in = (in+1)%n;
   signal(mutex);
   signal(full);
  }while(true);
 }
 
 void Consumer() {
  do {
   wait(cmutex);                 //消费者和消费者之间互斥
   for(int i=0;i<10;i++) {       //一个消费者循环执行10次
    wait(full);
    wait(mutex);
    nextc=buffer[out];
    out = (out+1)%n;
    signal(mutex);
    sigal(empty);
    consumer the item in nextc;
    ...
   }
   signal(cmutex);               //释放cmutex,下一个消费者可进来
  }while(true);
 }
 

2.两个搬运工人向卡车中装纯净水,每车最多20箱。卡车装满即开走,需装10辆车。给出简单的同步分析及算法,写明信号量的含义和初值。(信号量和普通变量结合使用)

semaphore water=0, mutex=1, go=0, wmutex=1; 
int main() {
     for(int i=0;i<10;i++)
   car();
  worker();
  worker();
 }
 
 //控制车
 int car() {
  while(1) {
   wait(mutex);                 //10辆车互斥
   车进入;
   for(int i=0;i<20;i++)
    signal(water);           //一辆车释放20箱水
   wait(go);                    //等待着车装满20箱水
   车走;
   signal(mutex);               //唤醒下一辆车
  }
 }
 
 
 //控制工人
 int worker() {
  while(1) {
   wait(water);
   装水;
   wait(wmutex);                //两个工人对in计数的互斥 
   in = in+1;
   if(in>=20) {
    in=0;
    signal(go);              //20箱水装满,给车信号
   }
   signal(wmutex);              //一个工人对in+1完成之后释放资源
  }
 }

你可能感兴趣的:(笔记)