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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值