注意:在每个程序中多个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;
}