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的阻塞队列中唤醒一个进程
}
}
- 进程互斥访问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);
}
- 生产者消费者问题
能不能先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);
}
- 售票员与司机问题