工作生活

操作系统

2019-07-02  本文已影响0人  小哲1998
int in=0,out=0;
item buffer[in];
semaphore mutex=1,empty=n,full=0;
void producer(){
    do{
        producer an item nextp;//生产一双鞋
        ...
        Swait(empty,mutex);//记一个空位,empty-1
        buffer[in]=nextp;//放进鞋
        in=(in+1)%n;
        Singal(mutex,full);//full 0->1;仓库有鞋了
    }while(true)
}
void consumer(){
    do{
        Swait(full,mutex);//full=0时阻塞访问临界资源
        nextc=buffer[out];
        out=(out+1)%n;
        Signal(mutex,empty);
        consumer the item in nextc;
        ...
    }while(true)
}

利用管程:(不加mutex管程就是为了解决互斥)

/*PC管程*/
Monitor producerconsumer{
 item buffer[N];
 int in,out;
 condition notfull,notempty;
 int count;
 public:
 void put(item x){
     if(count≥N)
     cwait(notfull);
     buffer[in]=x;
     in=(in+1)%N;
     count++;//当count>N时,缓冲池满
     csignal(notempty);
 }
 void get(item x){
     if(count≥N)
     cwait(notfull);
     buffer[in]=x;
     in=(in+1)%N;
     count--;//当count<0时,缓冲池空,消费者应等待
     csignal(notempty);
 }
 {in=0;out=0;count=0;}
}PC;
/*解决生产者-消费者问题*/
void producer(){
    item x;
    while(true){
        ...
        produce an item in nextp;
        pc.put(x);
    }
}
void consumer(){
    item x;
    while(true){
        pc.get(x);
        consumer the item in nextc;
        ...
    }
}
void main(){
    cobegin
    producer();
    consunmer();
    coend;
}

PS:使用记录型信号量时

void producer(){
    do{
        producer an...;
        wait(empty)/wait(mutex);
        //与用AND信号量不同的地方,consumer()一样
    }while(true)
}

原作者:傅
电子版:小哲
未经许可禁止转载

上一篇下一篇

猜你喜欢

热点阅读