经典同步问题 5个生产者和5个消费者共享3个缓冲区问题(C++实现)

 

 

#include <iostream> 
#include <stdlib.h> 
#include <STDIO.H> 
#include <windows.h> 

using namespace std; 

typedef int semaphore;                          /* 信号量是一种特殊的整型变量 */     
const int SIZE_OF_BUFFER = 3 ;                                //缓冲区长度 
const unsigned short PRODUCERS_COUNT = 5;       //生产者的个数 
const unsigned short CONSUMERS_COUNT = 5;       //消费者的个数 

DWORD producers[PRODUCERS_COUNT] ; //生产者线程的标识符                       
DWORD consumers[CONSUMERS_COUNT] ;//消费者线程的标识符 

const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; //总的线程数 

/** 
*定义信号量 
*/ 
HANDLE mutex ;                               //互斥信号量  
HANDLE full ;                             //表示放有产品的缓冲区数,其初值为0  
HANDLE empty ;                            //表示可供使用的缓冲区数,其初值为N  

/** 
*定义共享缓冲区 
*/ 
semaphore buffer[SIZE_OF_BUFFER];  

/** 
*定义生产者和消费者使用的指针  
*/ 
int in = 0 ; 
int out = 0 ; 

int productNum = 0 ; 

DWORD WINAPI Producer(LPVOID) ; 
DWORD WINAPI Consumer(LPVOID) ; 

int main(int argc, char *argv[]) 

    //创建Mutex和Semaphore 
    mutex = CreateMutex(NULL,FALSE,NULL); 
    full = CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL); 
    empty = CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL); 
     
     
    HANDLE PVThreads[THREADS_COUNT];     //各线程的handle  
     
     //创建生产者线程 
     for (int i=0;i<PRODUCERS_COUNT;i++){ 
          PVThreads[i] = CreateThread(NULL,0,Producer,NULL,0,&producers[i]); 
          if (PVThreads[i] == NULL) break; 
     } 
     //创建消费者线程  
     for (int i=0;i<CONSUMERS_COUNT;i++){ 
           PVThreads[PRODUCERS_COUNT+i] 
                =CreateThread(NULL,0,Consumer,NULL,0,&consumers[i]); 
            if (PVThreads[i]!=NULL) break; 
     } 
     
    bool isContinue = true ; 
    while(isContinue) 
    {  
          if(getchar()){  //按回车后终止程序运行 
               isContinue = false;  
           } 
    } 
    system("PAUSE");     
    return 0; 

void enBuffer(int pos) 

    cout<<"正在生产产品..."<<endl ; 
    Sleep(2000) ; 
    buffer[pos] = -1 ; 
    productNum++ ; 
    cout<<"生产完成!    已生产"<<productNum<<"个产品,并将新产品放在了缓冲区位置:"<<pos<<endl ; 

void deBuffer(int pos) 

    cout<<"正在消费产品..."<<endl ; 
    Sleep(1000) ; 
    buffer[pos] = -2 ; 
    productNum-- ; 
    cout<<"已消费在缓冲区位置:"<<pos<<"的产品,缓冲区剩余空间:"<<SIZE_OF_BUFFER-productNum<<endl ; 
    cout<<endl ;  

/** 
*生产者  
*/ 
DWORD WINAPI Producer(LPVOID lpParam ) 

    while(1) 
    { 
        WaitForSingleObject(empty,INFINITE);  // P(empty) 生产者信号量 -1  
        WaitForSingleObject(mutex,INFINITE);  // P(mutex) 获取线程间互斥信号  
        enBuffer(in) ; 
        Sleep(1000) ; 
        in = (in+1)%SIZE_OF_BUFFER ; 
        ReleaseMutex(mutex);                  // V(mutex) 释放线程间互斥信号  
        ReleaseSemaphore(full,1,NULL);        // V(full) 消费者信号量 +1  
         
    } 
    return 0; 

/** 
*消费者  
*/ 
DWORD WINAPI Consumer(LPVOID lpPara) 

    while(1) 
    { 
        WaitForSingleObject(full,INFINITE)== WAIT_ABANDONED ;        //P(full) 消费者信号量-1  
        WaitForSingleObject(mutex,INFINITE);       //P(mutex) 获得线程间互斥信号  
        deBuffer(out) ; 
        Sleep(1000) ; 
        out = (out+1)%SIZE_OF_BUFFER ; 
        ReleaseMutex(mutex);                       //V(mutex) 释放线程间互斥信号  
        ReleaseSemaphore(empty,1,NULL);            //V(empty) 生产者信号量+1  
         
    } 
    return 0; 
}

经典同步问题 5个生产者和5个消费者共享3个缓冲区问题(C++实现)

参考资料: