注意:在每个程序中多个wait操作顺序不可以颠倒。应先执行对资源信号量的wait操作,然后再执行对互斥信号量的wait操作,否则可能引起进程死锁。
概述:p操作:同步再前, 互斥再后
//记录型信号量
#include<bits/stdc++.h>
using namespace std;
int in=0;//队列的队首
int out=0;//队列的队尾
int buff[n];//缓冲区
bool mutex=1;//缓冲区是否可用
int empty=n;//空缓冲区的个数
int full=0; //有数据的缓冲区的个数
void producer()
{
do
{
/**************/
int cp; //生产
scanf("%d",&cp);
/**************/
wait(empty);//是否有空缓冲区
wait(mutex);//申请控制缓冲区
buff[in]=cp;//放入产品
in=(in+1)%n;
signal(mutex);//释放缓冲区
signal(full); //产品数+1
}while(true)
}
void consumer()
{
do
{
int cp;
wait(full) //是否有产品
wait(mutex);//申请控制缓冲区
cp=buff[out];//取走产品
out=(out+1)%n;
singnal(mutex)//释放缓冲区
singnal(empty);//空缓冲区+1
/**************/
printf("%d\n",cp);//消费
/**************/
}while(true);
}
int main()
{
return 0;
}
//ADD信号量:
#include<bits/stdc++.h>
using namespace std;
int in=0;//队列的队首
int out=0;//队列的队尾
int buff[n];//缓冲区
bool mutex=1;//缓冲区是否可用
int empty=n;//空缓冲区的个数
int full=0; //有数据的缓冲区的个数
void producer()
{
do
{
/**************/
int cp; //生产
scanf("%d",&cp);
/**************/
wait(empty, mutex);//是否有空缓冲区 申请控制缓冲区
buff[in]=cp;//放入产品
in=(in+1)%n;
signal(mutex, full);//释放缓冲区 产品数+1
}while(true)
}
void consumer()
{
do
{
int cp;
wait(full, mutex) //是否有产品 申请控制缓冲区
cp=buff[out];//取走产品
out=(out+1)%n;
singnal(mutex, empty)//释放缓冲区 空缓冲区+1
/**************/
printf("%d\n",cp);//消费
/**************/
}while(true);
}
int main()
{
return 0;
}
//管程
#include<bits/stdc++.h>
using namespace std;
class producerconsumer
{
int buff[N];//缓冲区
int in, out;//指针
queue notfull, notempty;//生产者等待队列 消费者等待队列
int count; //缓冲区的数据个数 >=N缓冲区满 <=0缓冲区空
producerconsumer(){in=0, out=0, count=0;}
void put(int x)
{
if(count>=N)//缓冲区满
{
notfull.push();//生产者不能生产 进入等待队列
}
buff[in]=x;
in=(in+1)%N;
count++; //产品数++
notempty.pop();//唤醒等待队列的消费者
}
void get(int &x)
{
if(count<=0)//缓冲区空
{
notfull.push();//消费者不能取产品 进入等待队列
}
x=buff[out];
out=(out+1)%N;
count--;
notfull.pop()////唤醒等待队列的生产者
}
}PC;
void producer()
{
int x;
while(true)
{
/***********/
int x;
scanf("%d",&x);//生产
PC.put(x);
/***********/
}
}
void consumer()
{
int x;
while(true)
{
int x;
PC.get(x);
/***********/
printf("%d\n",x);//消费
/***********/
}
}
int main()
{
return 0;
}