当前位置:编程学习 > JAVA >>

PV操作(生产者-消费者问题)-2

PV操作(生产者-消费者问题)-2
www.diybl.com    时间 : 2010-06-09  作者:佚名   编辑:壹枝雪糕 点击:  1337 [ 评论 ]
-
-
/* 用信号量解决生产者-消费者问题 */    
    
#include <STDIO.H>     
    
#define N 10     
    
typedef int semaphore;  /* 信号量是一种特殊的整型变量 */    
     
 semaphore mutex=1;     /* 互斥访问 */    
 semaphore empty=N;     /* 记录缓冲区中空的槽数 */    
 semaphore full=0;      /* 记录缓冲区中满的槽数*/    
    
 semaphore buf[N];      /* 有N个槽数的缓冲区buf[N],并实现循环缓冲队列 */    
 semaphore front=0, rear=0;    
     
  void p(semaphore *x)  /* p操作 */    
 {    
    *x=(*x)-1;    
 }    
    
 void v(semaphore *y)   /* v操作 */    
 {    
    *y=(*y)+1;    
 }    
    
  void produce_item(int *item_ptr)    
 {    
    /*printf("produce an item\n");*/    
    *item_ptr='m';      /* 'm' is "man满" */    
 }    
    
 void enter_item(int x)    
 {    
    front=(front+1)%N;    
    buf[front]=x;           
    printf("enter_item %c to buf[%d]\n", buf[front], front);    
 }    
    
void remove_item(int *yy)    
{    
    rear=(rear+1)%N;    
    printf("remove_item %c from buf[%d]", buf[rear], rear);    
    *yy=buf[rear];    
    buf[rear]='k';      /* 'k' is "kong空" */    
    printf("  so the buf[%d] changed to empty--%c\n", rear, buf[rear]);    
}    
void consume_item(int y)    
{    
    printf("cosume the item :the screem print %c\n", y);    
}    
    
void producer(void);    
void consumer(void);    
    
/* 生产者 */    
void producer(void)    
{    
    int item;    
    
    while(1){    
        produce_item(&item);    
        p(&empty);          /* 递减空槽数 */    
        p(&mutex);          /* 进入临界区 */    
        enter_item(item);   /* 将一个新的数据项放入缓冲区 */    
        v(&mutex);          /* 离开临界区 */    
        v(&full);           /* 递增满槽数 */    
        if(full==N)         /* 若缓冲区满的话,唤醒消费者进程 */    
            consumer();    
    }     
}    
    
/* 消费者 */    
void consumer(void)    
{    
    int get_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();    
    
    return 0;    
}


文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/3_program/c++/cppsl/20081123/152358.html --------------------编程问答-------------------- --------------------编程问答-------------------- 楼主把C码贴J区... --------------------编程问答-------------------- 这是生产者、消费者么?都不是并发执行的。 --------------------编程问答-------------------- 让我回想起自己写的生产者,消费者程序,当时还是在通过Applet方式执行给老师演示的。
老师看了之后,说:这是你写的? 我说:是。
老师说:怎么写的 。   我说:用java写的。
老师说:你还会java呀。   我说,会。
老师说:java也能写这程序?  我说:可以吧,我也不知道。
老师说:恩,不错。      我说:那我这门课程算不算过了。
老师说:虽然你写的东西我没见过,但是貌似是那么回事,算你过 。  我说: 谢谢老师。
--------------------编程问答-------------------- 很好发给很饥渴
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,