⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 producer-consumer.txt

📁 用信号量解决生产者消费者问题
💻 TXT
字号:
#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;    
}   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -