PV操作(生产者消费者)

2019-02-23  本文已影响0人  小幸运Q

进程的同步机制:

信号量S:尚未占用的资源数量

// 申请资源
P(S){
    S=S-1;
    if(S<0){
        // 调用该P操作的进程阻塞,插入阻塞队列。
    }
}

// 释放资源
V(S){
    S=S+1;
    if(S<=0){
        // 从等待信号量S的阻塞队列中唤醒一个进程
    }
}

  1. 进程互斥访问count然后++:
count=0;
S semaphore;     // 公用信号量
S=1;
Process P1{
  P(S);
  R1=count;
  R1=R1+1;
  count=R1;
  V(S);
}
Process P2{
  P(S);
  R2=count;
  R2=R2+1;
  count=R2;
  V(S);
}

  1. 生产者消费者问题

能不能先mutex再S1,S2?
不能,当生产者已经将缓冲区充满,消费者还没消费,则mutex上锁后阻塞在S1,然后消费者想mutex但是被阻塞,最后产生死锁。

mutex=1 同步信号量用于缓冲区互斥访问
S1=n 生产者进程(n为缓冲区大小) 
S2=0 消费者进程

// 生产者
while(true){
  P(S1);
  P(mutex);
  // 放入一件物品
  V(mutex);
  V(S2);
}
// 消费者
while(true){
  P(S2);
  P(mutex);
  // 拿出一件物品
  V(mutex);
  V(S1);
}

  1. 售票员与司机问题
image.png
上一篇下一篇

猜你喜欢

热点阅读