os

正确答案

semaphore mutex1=1;
semaphore mutex2=1;
semaphore empty=n;
semaphore full=0;
producer(){
    while(1){
        生产一个产品;
        P(empty); //判断缓冲区是否有空位
        P(mutex2); //互斥访问缓冲区
        把产品放入缓冲区;
        V(mutex2); //互斥访问缓冲区
        V(full); //产品的数量加 1 
    } 
}
consumer(){
    while(1){
        P(mutex1) //连续取 10 次
        for(int i = 0; i <= 10; ++i){
            P(full); //判断缓冲区是否有产品
            P(mutex2); //互斥访问缓冲区
            从缓冲区取出一件产品;
            V(mutex2); //互斥访问缓冲区
            V(empty); //腾出一个空位
        消费这件产品; }
        V(mutex1)
}

错误答案如下,当消费者获得mutex信号量之后,假设此时不够10个产品,则进程会陷入死锁,因为生产者也不能进入临界区,本质上是先互斥访问后检查资源是否满足而导致的

semaphore mutex=1;
semaphore empty=n;
semaphore full=0;
producer(){
     while(1){
        生产一个产品;
        P(empty); //判断缓冲区是否有空位
        P(mutex); //互斥访问缓冲区
        把产品放入缓冲区;
        V(mutex); //互斥访问缓冲区
        V(full); //产品的数量加 1 
    } 
}
consumer(){
    while(1){
        P(mutex) //连续取 10 次
        for(int i = 0; i < 10; ++i){
            P(full); //判断缓冲区是否有产品
            从缓冲区取出一件产品;
            V(empty); //腾出一个空位
            消费这件产品; 
        }
        V(mutex)
posted @ 2023-03-27 21:53  jayus71  阅读(27)  评论(0)    收藏  举报