现在的位置: 首页 > 综合 > 正文

PV操作(生产者-消费者问题)-1【转帖】

2014年02月28日 ⁄ 综合 ⁄ 共 3658字 ⁄ 字号 评论关闭

PV操作(生产者-消费者问题)-1【转帖】

 

  1. /*
  2.     caoyuan
  3.     2006-12-26
  4.     PV operation producer and consumer 
  5. */
  6. #include <windows.h>
  7. #include <iostream>
  8. using namespace std;
  9.     
  10. const unsigned short SIZE_OF_BUFFER = 10;   //缓冲区长度
  11. unsigned short ProductID = 0;               //产品号
  12. unsigned short ConsumeID = 0;               //将被消耗的产品号
  13. unsigned short in = 0;                      //产品进缓冲区时的下标
  14. unsigned short out = 0;                     //产品出缓冲区时的下标
  15.    
  16. int pv_buffer[SIZE_OF_BUFFER];               //缓冲区是个循环队列
  17. bool pv_continue = true;                     //控制程序结束
  18. HANDLE pv_hMutex;                            //用于线程间的互斥,主要用于控制台打印 
  19. HANDLE fullSemaphore;                        //消费者进程的私用信号量
  20. HANDLE emptySemaphore;                       //生产者进程的私用信号量
  21.   
  22. DWORD WINAPI Producer(LPVOID);              //生产者线程
  23. DWORD WINAPI Consumer(LPVOID);              //消费者线程
  24. int main()
  25. {
  26.     //创建Mutex和Semaphore
  27.     pv_hMutex = CreateMutex(NULL,FALSE,NULL);
  28.     fullSemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL);
  29.     emptySemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER,
  30.                                    SIZE_OF_BUFFER,NULL);
  31.     //缓冲区初始化
  32.     for (int i = 0; i< SIZE_OF_BUFFER;++i){
  33.       pv_buffer[i] = -1;   //当值为-1时该项为空
  34.      }
  35.    
  36.     const unsigned short PRODUCERS_COUNT = 3;       //生产者的个数
  37.     const unsigned short CONSUMERS_COUNT = 2;       //消费者的个数
  38.     //总的线程数
  39.     const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;
  40.      HANDLE pvThreads[THREADS_COUNT];     //各线程的handle
  41.      DWORD producerID[PRODUCERS_COUNT];  //生产者线程的标识符
  42.      DWORD consumerID[CONSUMERS_COUNT];  //消费者线程的标识符
  43.     
  44.        //创建生产者线程
  45.      for (int i=0;i<PRODUCERS_COUNT;i++){
  46.           pvThreads[i] = CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);
  47.           if (pvThreads[i] == NULL) break;
  48.      }
  49.        //创建消费者线程
  50.      for (int i=0;i<CONSUMERS_COUNT;i++){
  51.            pvThreads[PRODUCERS_COUNT+i]
  52.                 =CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);
  53.             if (pvThreads[i]==NULL) break;
  54.      }
  55.    
  56.      while(pv_continue){ 
  57.           if(getchar()){  //按回车后终止程序运行
  58.                pv_continue = false
  59.            }
  60.       }
  61.       system("pause");
  62.       return 0;
  63. }
  64.     
  65.   //生产一个产品。简单模拟了一下,仅输出新产品的ID号
  66. void Produce()
  67. {
  68.     cout << "生产 " << ++ProductID << "号产品   ";
  69.     Sleep(1500);   
  70.     cout << " :) " << endl;
  71. }
  72.    
  73. //把新生产的产品放入缓冲区
  74. void Put()
  75. {
  76.     cout << "向仓库中放入产品     ";
  77.     pv_buffer[in] = ProductID;
  78.     in = (in+1)%SIZE_OF_BUFFER;
  79.     Sleep(1500);   
  80.     cout << ":)" << endl;
  81. }
  82.    
  83. //从缓冲区中取出一个产品
  84. void Take()
  85. {
  86.     ConsumeID = pv_buffer[out];
  87.     cout << "从仓库中取出第 "<<ConsumeID<<" 号货物    ";
  88.     pv_buffer[out]= -1;
  89.     out = (out+1)%SIZE_OF_BUFFER;
  90.     Sleep(1500);   
  91.     cout << ":)" << endl; 
  92.   
  93. }
  94.     
  95. //消耗一个产品
  96. void Consume()
  97. {
  98.     cout << "消费掉第 " << ConsumeID << " 号货物    ";
  99.     Sleep(1500);   
  100.     cout << ":)" << endl; 
  101. }
  102.     
  103. //生产者
  104. DWORD  WINAPI Producer(LPVOID lpPara)
  105. {
  106.     while(pv_continue){
  107.       WaitForSingleObject(emptySemaphore,INFINITE);  // P(emptySemaphore) 生产者信号量 -1 
  108.       WaitForSingleObject(pv_hMutex,INFINITE);      // P(Mutex) 获取线程间互斥信号 
  109.       Produce();
  110.       Put();
  111.       Sleep(1500);           
  112.       ReleaseSemaphore(fullSemaphore,1,NULL);        // V(fullSemaphore) 消费者信号量 +1 
  113.       ReleaseMutex(pv_hMutex);                      // V(Mutex) 释放线程间互斥信号 
  114.     }
  115.     return 0;
  116. }
  117.     
  118. //消费者
  119. DWORD  WINAPI Consumer(LPVOID lpPara)
  120. {
  121.     while(pv_continue){
  122.        WaitForSingleObject(fullSemaphore,INFINITE);   //P(fullSemaphore) 消费者信号量-1 
  123.        WaitForSingleObject(pv_hMutex,INFINITE);       //P(Mutex) 获得线程间互斥信号 
  124.        Take();
  125.        Consume();
  126.        Sleep(1500);           
  127.        ReleaseSemaphore(emptySemaphore,1,NULL);        //V(emptySemaphore) 生产者信号量+1 
  128.        ReleaseMutex(pv_hMutex);                       //V(Mutex) 释放线程间互斥信号 
  129.     }
  130.     return 0;
  131. }
  132.     

抱歉!评论已关闭.