生产者-消费者的PV操作伪代码

 来之google 收索结果

f  ull 和 empty 。信号量mutex作为互斥信号量,它用于控制互斥访问缓冲池,互斥信号量初值为 1;
信号量 full 用于记录当前缓冲池中“满”缓冲区数,初值为0。信号量 empty 用于记录当前缓冲池中“空”缓冲区数,初值为n。
新的数据添加到缓存中后,full 在增加,而 empty 则减少。如果生产者试图在 empty 为0时减少其值,生产者就会被“催眠”。
下一轮中有数据被消费掉时,empty就会增加,生产者就会被“唤醒”。

复制代码
semaphore mutex=1; //临界区互斥信号量
semaphore empty=n;  //空闲缓冲区
semaphore full=0;  //缓冲区初始化为空
producer ()//生产者进程 
{
    while(1)
    {
        produce an item in nextp;  //生产数据
        P(empty);  //获取空缓冲区单元
        P(mutex);  //进入临界区.
        add nextp to buffer;  //将数据放入缓冲区
        V(mutex);  //离开临界区,释放互斥信号量
        V(full);  //满缓冲区数加1
    }
}

consumer ()//消费者进程
{
    while(1)
    {
        P(full);  //获取满缓冲区单元
        P(mutex);  // 进入临界区
        remove an item from buffer;  //从缓冲区中取出数据
        V (mutex);  //离开临界区,释放互斥信号量
        V (empty) ;  //空缓冲区数加1
        consume the item;  //消费数据
    }
}
复制代码

 

 

items代表缓冲区可使用的资源数,space代表缓冲区可用资源数
mutex表示互斥锁
buf[10]代表缓冲区,内容类型为item
in、out代表第一个资源和最后一个资源(i即in最早产生的资源)

复制代码
var items=0,sapce=10,mutex=1;
var in=0,out=0;
item buf[10]={
    NULL};
producer{
    
    while(true){
    
        P(space);//等待缓冲区有空闲位置,在使用PV操作时,条件变量需要在互斥锁之前
        P(mutex);//保证在product时不会有其他进程访问缓冲区
        //product
        buf.push(item,in);  //将新资源放到buf[in]位置
        in=(in+1)%10;
        V(mutex);
        V(items);
      }
}

consumer{
    
   while(true){
    
    P(items);  //等待缓冲区有资源可以使用
    P(mutex);  //保证在consume时不会有其他线程访问缓冲区
    //consume
    buf.pop(out); //将buf[out]位置的资源取走
    out=(out+1)%10;
    V(mutex);
    V(space);
 }
}
复制代码

 

posted @   codestacklinuxer  阅读(1162)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示