信号量解决生产者消费者问题


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

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( ); 
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM