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

本文通过PV操作解决了经典的生产者-消费者问题,利用信号量机制实现了进程间的同步与互斥,确保了缓冲区的安全使用。文章详细介绍了如何通过信号量empty、full和mutex来控制缓冲区的读写过程。

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

  1. /*用信号量解决生产者-消费者问题*/
  2. #include<STDIO.H>
  3. #defineN10
  4. typedefintsemaphore;/*信号量是一种特殊的整型变量*/
  5. semaphoremutex=1;/*互斥访问*/
  6. semaphoreempty=N;/*记录缓冲区中空的槽数*/
  7. semaphorefull=0;/*记录缓冲区中满的槽数*/
  8. semaphorebuf[N];/*有N个槽数的缓冲区buf[N],并实现循环缓冲队列*/
  9. semaphorefront=0,rear=0;
  10. voidp(semaphore*x)/*p操作*/
  11. {
  12. *x=(*x)-1;
  13. }
  14. voidv(semaphore*y)/*v操作*/
  15. {
  16. *y=(*y)+1;
  17. }
  18. voidproduce_item(int*item_ptr)
  19. {
  20. /*printf("produceanitem/n");*/
  21. *item_ptr='m';/*'m'is"man满"*/
  22. }
  23. voidenter_item(intx)
  24. {
  25. front=(front+1)%N;
  26. buf[front]=x;
  27. printf("enter_item%ctobuf[%d]/n",buf[front],front);
  28. }
  29. voidremove_item(int*yy)
  30. {
  31. rear=(rear+1)%N;
  32. printf("remove_item%cfrombuf[%d]",buf[rear],rear);
  33. *yy=buf[rear];
  34. buf[rear]='k';/*'k'is"kong空"*/
  35. printf("sothebuf[%d]changedtoempty--%c/n",rear,buf[rear]);
  36. }
  37. voidconsume_item(inty)
  38. {
  39. printf("cosumetheitem:thescreemprint%c/n",y);
  40. }
  41. voidproducer(void);
  42. voidconsumer(void);
  43. /*生产者*/
  44. voidproducer(void)
  45. {
  46. intitem;
  47. while(1){
  48. produce_item(&item);
  49. p(&empty);/*递减空槽数*/
  50. p(&mutex);/*进入临界区*/
  51. enter_item(item);/*将一个新的数据项放入缓冲区*/
  52. v(&mutex);/*离开临界区*/
  53. v(&full);/*递增满槽数*/
  54. if(full==N)/*若缓冲区满的话,唤醒消费者进程*/
  55. consumer();
  56. }
  57. }
  58. /*消费者*/
  59. voidconsumer(void)
  60. {
  61. intget_item;
  62. while(1){
  63. p(&full);/*递减满槽数*/
  64. p(&mutex);/*进入临界区*/
  65. remove_item(&get_item);/*从缓冲区中取走一个数据项*/
  66. v(&mutex);/*离开临界区*/
  67. v(&empty);/*递增空槽数*/
  68. consume_item(get_item);/*对数据项进行操作(消费)*/
  69. if(empty==N)/*若缓冲区全空的话,唤生产者进程*/
  70. producer();
  71. }
  72. }
  73. /*调用生产者-消费者进程实现进程间同步*/
  74. main()
  75. {
  76. producer();
  77. return0;
  78. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值