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)

浙公网安备 33010602011771号