进程同步实验——生产者与消费者问题算法实现


进程同步实验——生产者与消费者问题算法实现
资源截图
代码片段和文件信息
  /*————————————————————————————————
  在同一个进程地址空间内执行的两个线程。生产者线程生产物品,
  然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线
  程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物
  品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者
  线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有
  满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出
  来。
——————————————————————————————————*/
  #include   
  #include
  #include   
    
  const   unsigned   short   SIZE_OF_BUFFER   =   10;   //缓冲区长度   
  unsigned   short   ProductID   =   0;         //产品号   
  unsigned   short   ConsumeID   =   0;         //将被消耗的产品号   
  unsigned   short   in   =   0;             //产品进缓冲区时的缓冲区下标   
  unsigned   short   out   =   0;             //产品出缓冲区时的缓冲区下标   
    
  int   g_buffer[SIZE_OF_BUFFER];         //缓冲区是个循环队列   
  bool   g_continue   =   true;             //使程序跳出循环,控制程序结束   
  HANDLE   g_hMutex;               //用于线程间的互斥   
  HANDLE   g_hFullSemaphore;           //当缓冲区满时迫使生产者等待   
  HANDLE   g_hEmptySemaphore;           //当缓冲区空时迫使消费者等待   
    
  DWORD   WINAPI   Producer(LPVOID);         //生产者线程   
  DWORD   WINAPI   Consumer(LPVOID);         //消费者线程   
    
  int   main()   
  {   
          //创建各个互斥信号   
          g_hMutex   =   CreateMutex(NULLFALSENULL);  // 三个参数分别为:指向安全属性的指针 
//初始化互斥对象的所有者指向互斥对象名的指针
          //创建缓冲区满的信号量
          g_hFullSemaphore   =   CreateSemaphore(NULLSIZE_OF_BUFFER-1SIZE_OF_BUFFER-1NULL); 
//四个参数分别为:表示是否允许继承、
//设置信号机的初始计数、设置信号机的
   //最大计数、指定信号机对象的名称(-1是因为计数从0开始)
          //创建缓冲区空的信号量
  g_hEmptySemaphore   =   CreateSemaphore(NULL0SIZE_OF_BUFFER-1NULL);   
    
          //调整下面的数值,可以发现,当生产者个数多于消费者个数时,   
          //生产速度快,生产者经常等待消费者;反之,消费者经常等待     
          const   unsigned   short   PRODUCERS_COUNT   =   3;     //生产者的个数   
          const   unsigned   short   CONSUMERS_COUNT   =   3;     //消费者的个数   
    
          //总的线程数   
          const   unsigned   short   THREADS_COUNT   =   PRODUCERS_COUNT+CONSUMERS_COUNT;   
    
          HANDLE   hThreads[PRODUCERS_COUNT];   //各线程的handle   
          DWORD   producerID[CONSUMERS_COUNT];   //生产者线程的标识符   
          DWORD   consumerID[THREADS_COUNT];   //消费者线程的标识符   
    
          //为每一个生产者创建生产者线程   
          for(int i=0;i                  hThreads[i]=CreateThread(NULL0ProducerNULL0&producerID[i]);   
                  if   (hThreads[i]==NULL)   return   -1;   
          }   
          //为每一个消费者创建消费者线程   
          for(int j=0;j                  hThreads[PRODUCERS_COUNT+j]=CreateThread(NULL0ConsumerNULL0&consumerID[j]);   
                  if   (hThreads[j]==NULL)   return   -1;   
          }   
    
          while(g_continue){   
                  if(getchar()){   //按回车后终止程序运行   
                          g_continue   =   false;   
                  }   
          }   
    
          return   0;   
  }   
    
  //生产一个产品。简单模拟了一下,仅输出新产品的ID号   
  void   Produce()   
  {   
      

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     184436  2009-01-04 20:40  Debugsx3.exe

     文件     229928  2009-01-04 20:40  Debugsx3.ilk

     文件      25242  2009-01-04 20:40  Debugsx3.obj

     文件    3616828  2009-01-04 20:40  Debugsx3.pch

     文件     394240  2009-01-04 20:40  Debugsx3.pdb

     文件     148480  2009-01-04 20:40  Debugvc60.idb

     文件      86016  2009-01-04 20:40  Debugvc60.pdb

     文件     208955  2007-12-31 21:33  sx3(1消费者,3个生产者).exe

     文件     208954  2008-01-03 20:43  sx3(3个生产者,4个消费者,15个缓冲区).exe

     文件     208955  2007-12-31 21:37  sx3(3个消费者,1个生产者).exe

     文件     208955  2007-12-31 21:38  sx3(3个消费者,3个生产者).exe

     文件       6847  2007-12-31 22:00  sx3.cpp

     文件       3365  2009-01-04 20:40  sx3.dsp

     文件        531  2009-01-04 20:41  sx3.dsw

     文件      33792  2009-01-04 20:41  sx3.ncb

     文件      48640  2009-01-04 20:41  sx3.opt

     文件        731  2009-01-04 20:40  sx3.plg

     文件    1412608  2009-01-03 21:11  操作系统原理实验报告.doc

     目录          0  2009-01-04 20:40  Debug

----------- ---------  ---------- -----  ----

              7027503                    19


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)