信号量semaphore
表示资源个数的整型量
>0 表示当前资源的个数
<0 其绝对值表示系统中因请求该类资源而造成的阻塞进程个数
PV操作
两条原语(一种特殊的操作不能被系统中断)
P(S)= -1分配一个可用资源
V(S)= +1释放一个资源
生产者消费者问题
共享一个缓冲区,生产者投放/消费者获取
semaphore mutex=1; //控制生产者消费者之一进入缓冲区
semaphore full=0; //缓冲区中满的个数
semaphore empty=n; //缓冲区中空的个数
main(){
cobegin
producer();
consumer();
coend
}
producer(){
while(true){
生产;
P(empty);
P(mutex);
将一个产品放入缓冲区;
V(mutex);
V(full);
}
}
consumer(){
while(true){
P(full);
P(mutex);
取一个产品出缓冲区;
V(mutex);
V(empty);
消费;
}
}
生产和消费操作中的P(占用)操作不能交换顺序,否则可能产生死锁
读者写作问题
多个读者可以同时访问数据集,但写进程不能和写进程或者读进程同时访问数据集
int rc=0; //读者数
semaphore mutex=1;
semaphore db=1;
main(){
cobegin;
reader();
writer();
coend;
}
reader(){
while(true){
P(mutex);
rc+=1;
if(rc==1)
P(db);
V(mutex);
读数据集;
P(mutex);
rc-=1;
if(rc==0)
V(db);
V(mutex);
}
}
writer(){
while(true){
P(db);
写数据集;
V(db);
}
}
读者进程一旦出现(根据rc判断)则写入进程资源(db)不可用,即最终呈现读者优先
哲学家就餐问题
五个哲学家在一个桌子上,有五根筷子分别在每个人旁边
semaphore stick[5]={1,1,1,1,1};
main(){
cobegin;
p(0);
p(1);
p(2);
p(3);
p(4);
coend;
}
p(i){
while(true){
P(stick[i]);
P(stick[(i+1)%5]);
吃饭;
V(stick[i]);
V(stick[(i+1)%5]);
}
}
解决死锁方法
- 限制只能四个人吃饭,必定有人能两根筷子吃上饭
- 奇数先拿左边偶数先拿右边,有个人两边都抢不到
p(i){
while(true){
if(i%2!=0){
P(stick[i]);
P(stick[(i+1)%5]);
吃饭;
V(stick[i]);
V(stick[(i+1)%5]);
}else{
P(stick[i+1]);
P(stick[(i)%5]);
吃饭;
V(stick[i+1]);
V(stick[(i)%5]);
}
}
}
- 左右都是空闲才吃饭
理发师睡觉问题
一个理发师一个理发椅五个等待椅,若没有顾客理发师睡觉,当有顾客来唤醒理发师,若理发师正在理且有等待椅空闲则坐下等,否则离开
semaphore waiting=6,mutex=1,wchair=5,bchair=1,ready=1,finish=1;
barber(){
while(true){
P(ready);
理发;
V(finish);
}
}
customer(){
while(true){
P(mutex);
if(waiting<6){
waiting+=1;
}else{
V(mutex);
离开;
}
P(wchair);
P(bchair);
V(wchair);
V(ready);
P(finish);
V(bchair);
P(mutex);
waiting-=1;
V(mutex);
}
}
来源:CSDN
作者:二煮茶
链接:https://blog.csdn.net/weixin_38843231/article/details/104802705