zoukankan      html  css  js  c++  java
  • 生产者消费者的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);
     }
    }
    http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子
  • 相关阅读:
    把C语言的指针按在地上摩擦!
    组合索引相关介绍
    ConcurrentModificationException异常
    chat和varchar的区别?
    二进制部署K8S集群(二十三)addons之安装部署dashboard
    二进制部署K8S集群(二十二)addons之安装部署ingress
    二进制部署K8S集群(二十一)addons之flanneld优化SNAT规则
    二进制部署K8S集群(二十)K8s服务暴露之NodePort型Service
    二进制部署K8S集群(十九)addons之安装部署coredns
    二进制部署K8S集群(十八)addons之flannel三种模型安装部署详解
  • 原文地址:https://www.cnblogs.com/codestack/p/11117465.html
Copyright © 2011-2022 走看看