zoukankan      html  css  js  c++  java
  • 信号量解决生产者消费者问题

    一、一个生产者、一个消费者共享一个缓冲区

    int B;
    semaphore empty;  //可以使用的空缓冲区数
    semaphore full;  //缓冲区内可以使用的产品数
    empty=1;         //缓冲区内允许放入一件产品
    full=0;          //缓冲区内没有产品
    
    process producer()
    {       
      while(true){               
        produce( );                
        P(empty); //申请空盘子               
        append( ) to B;            
        V(full);   //
       }                         
     }   
     
     process consumer()
     {
        while(true) 
        { 
           P(full);    //消费 
            take( ) from B;
           V(empty);
            consume( );
        }
    } 

    二、一个生产者、一个消费者共享多个缓冲区

    三、多个生产者、多个消费者共享多个缓冲区

    item B[k];
    semaphore empty;    empty=k;  
    semaphore full; full=0;      
    semaphore mutex=1;  //互斥信号量
    int in=0;    //放入缓冲区指针
    int out=0;   //取出缓冲区指针?
    
    process producer_i ( ){      
        while(true) 
        {                   
            produce( );                     
            P(empty); //申请临界区资源 
                                 
            P(mutex);   //确保唯一操作                      
            append to B[in];             
            in=(in+1)%k;                  
            V(mutex);   
                                 
            V(full);                                
        }                                               
    }
    
         
    process consumer_j ()
    {  
        while(true) 
        {
        P(full);//申请临界区资源 
        
        P(mutex);//确保唯一操作 
        take( ) from B[out];
        out=(out+1)%k; 
        V(mutex);
        
        V(empty);
        consume( ); 
    }
  • 相关阅读:
    PHP设计模式之适配器模式
    PHP设计模式之注册模式
    PHP中 构造函数(__construct)和析构函数(__destruct)
    PHP中 extends、implements、abstract、interface 的区别
    proxysql
    安装xtrabackup并进行全量备份
    锁解析
    索引与算法
    约束
    show语句
  • 原文地址:https://www.cnblogs.com/junfblog/p/12811669.html
Copyright © 2011-2022 走看看