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

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

 

  1. /* 用信号量解决生产者-消费者问题 */   
  2.    
  3. #include <STDIO.H>    
  4.    
  5. #define N 10    
  6.    
  7. typedef int semaphore;  /* 信号量是一种特殊的整型变量 */   
  8.     
  9.  semaphore mutex=1;     /* 互斥访问 */   
  10.  semaphore empty=N;     /* 记录缓冲区中空的槽数 */   
  11.  semaphore full=0;      /* 记录缓冲区中满的槽数*/   
  12.    
  13.  semaphore buf[N];      /* 有N个槽数的缓冲区buf[N],并实现循环缓冲队列 */   
  14.  semaphore front=0, rear=0;   
  15.     
  16.   void p(semaphore *x)  /* p操作 */   
  17.  {   
  18.     *x=(*x)-1;   
  19.  }   
  20.    
  21.  void v(semaphore *y)   /* v操作 */   
  22.  {   
  23.     *y=(*y)+1;   
  24.  }   
  25.    
  26.   void produce_item(int *item_ptr)   
  27.  {   
  28.     /*printf("produce an item/n");*/   
  29.     *item_ptr='m';      /* 'm' is "man满" */   
  30.  }   
  31.    
  32.  void enter_item(int x)   
  33.  {   
  34.     front=(front+1)%N;   
  35.     buf[front]=x;          
  36.     printf("enter_item %c to buf[%d]/n", buf[front], front);   
  37.  }   
  38.    
  39. void remove_item(int *yy)   
  40. {   
  41.     rear=(rear+1)%N;   
  42.     printf("remove_item %c from buf[%d]", buf[rear], rear);   
  43.     *yy=buf[rear];   
  44.     buf[rear]='k';      /* 'k' is "kong空" */   
  45.     printf("  so the buf[%d] changed to empty--%c/n", rear, buf[rear]);   
  46. }   
  47. void consume_item(int y)   
  48. {   
  49.     printf("cosume the item :the screem print %c/n", y);   
  50. }   
  51.    
  52. void producer(void);   
  53. void consumer(void);   
  54.    
  55. /* 生产者 */   
  56. void producer(void)   
  57. {   
  58.     int item;   
  59.    
  60.     while(1){   
  61.         produce_item(&item);   
  62.         p(&empty);          /* 递减空槽数 */   
  63.         p(&mutex);          /* 进入临界区 */   
  64.         enter_item(item);   /* 将一个新的数据项放入缓冲区 */   
  65.         v(&mutex);          /* 离开临界区 */   
  66.         v(&full);           /* 递增满槽数 */   
  67.         if(full==N)         /* 若缓冲区满的话,唤醒消费者进程 */   
  68.             consumer();   
  69.     }    
  70. }   
  71.    
  72. /* 消费者 */   
  73. void consumer(void)   
  74. {   
  75.     int get_item;   
  76.    
  77.     while(1){   
  78.             p(&full);           /* 递减满槽数 */   
  79.             p(&mutex);          /* 进入临界区 */   
  80.             remove_item(&get_item); /* 从缓冲区中取走一个数据项 */   
  81.             v(&mutex);          /* 离开临界区 */   
  82.             v(&empty);          /* 递增空槽数 */   
  83.             consume_item(get_item); /* 对数据项进行操作(消费)*/   
  84.             if(empty==N)        /* 若缓冲区全空的话,唤生产者进程 */   
  85.                 producer();            
  86.     }   
  87.  }   
  88.    
  89.  /* 调用生产者-消费者进程实现进程间同步 */   
  90.  main()   
  91. {   
  92.     producer();   
  93.    
  94.     return 0;   
  95. }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值