- /*用信号量解决生产者-消费者问题*/
- #include<STDIO.H>
- #defineN10
- typedefintsemaphore;/*信号量是一种特殊的整型变量*/
- semaphoremutex=1;/*互斥访问*/
- semaphoreempty=N;/*记录缓冲区中空的槽数*/
- semaphorefull=0;/*记录缓冲区中满的槽数*/
- semaphorebuf[N];/*有N个槽数的缓冲区buf[N],并实现循环缓冲队列*/
- semaphorefront=0,rear=0;
- voidp(semaphore*x)/*p操作*/
- {
- *x=(*x)-1;
- }
- voidv(semaphore*y)/*v操作*/
- {
- *y=(*y)+1;
- }
- voidproduce_item(int*item_ptr)
- {
- /*printf("produceanitem/n");*/
- *item_ptr='m';/*'m'is"man满"*/
- }
- voidenter_item(intx)
- {
- front=(front+1)%N;
- buf[front]=x;
- printf("enter_item%ctobuf[%d]/n",buf[front],front);
- }
- voidremove_item(int*yy)
- {
- rear=(rear+1)%N;
- printf("remove_item%cfrombuf[%d]",buf[rear],rear);
- *yy=buf[rear];
- buf[rear]='k';/*'k'is"kong空"*/
- printf("sothebuf[%d]changedtoempty--%c/n",rear,buf[rear]);
- }
- voidconsume_item(inty)
- {
- printf("cosumetheitem:thescreemprint%c/n",y);
- }
- voidproducer(void);
- voidconsumer(void);
- /*生产者*/
- voidproducer(void)
- {
- intitem;
- while(1){
- produce_item(&item);
- p(&empty);/*递减空槽数*/
- p(&mutex);/*进入临界区*/
- enter_item(item);/*将一个新的数据项放入缓冲区*/
- v(&mutex);/*离开临界区*/
- v(&full);/*递增满槽数*/
- if(full==N)/*若缓冲区满的话,唤醒消费者进程*/
- consumer();
- }
- }
- /*消费者*/
- voidconsumer(void)
- {
- intget_item;
- while(1){
- p(&full);/*递减满槽数*/
- p(&mutex);/*进入临界区*/
- remove_item(&get_item);/*从缓冲区中取走一个数据项*/
- v(&mutex);/*离开临界区*/
- v(&empty);/*递增空槽数*/
- consume_item(get_item);/*对数据项进行操作(消费)*/
- if(empty==N)/*若缓冲区全空的话,唤生产者进程*/
- producer();
- }
- }
- /*调用生产者-消费者进程实现进程间同步*/
- main()
- {
- producer();
- return0;
- }
PV操作(生产者-消费者问题)-2【转帖】
