信號量解決生產者消費者問題


一、一個生產者、一個消費者共享一個緩沖區

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