生产者与消费者模型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37964547/article/details/79968643

一、生产与消费者模型

1、基本概念模型

生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,模型图如下所示:
这里写图片描述

2、必须具有的条件

(1) 三种关系:三种关系分别指的是:消费者和消费者,生产者和生产者,生产者和消费者;其中消费者和消费者,生产者和生产者之间都属于竞争关系,生产者和消费者之间的关系相当于是一种食物链之间的依赖关系。
(2)两类角色:指的是生产者和消费者;
(3)一个交易场所:交易场所指的是生产者和消费者之间进行数据交换的仓库,这块仓库相当于一个缓冲区,生产者负责把数据放入到缓冲区中,消费者负责把缓冲区中的数据取出来;

3、生产者与消费者模型特点

1、生产者生产的时候消费者不能消费

2、消费者消费的时候生产者不能生产

3、缓冲区空时消费者不能消费

4、缓冲区满时生产者不能生产

二、实现生产者消费者模型

基于单链表模式下的生产者与消费者模型:

用单链表作为该模型的交易场所,充当“仓库”的角色,创建两个线程,一个为生产者,一个为消费者,生产者每生产一个就头插到单链表中,消费者每消费一个就从单链表中删除一个节点,并对该模型进行加锁和加条件变量,使得上述三种关系得到满足:

  1 #include<stdio.h>
  2 #include<pthread.h>
  3 #include<unistd.h>
  4 #include<stdlib.h>
  5 #include<assert.h>
  6 
  7 typedef struct Node
  8 {
  9     int data;
 10     struct Node * next;
 11 }Node,*Node_p,**Node_pp;
    Node_p list=NULL;
    pthread_mutex_t mylock= PTHREAD_MUTEX_INITIALIZER;
    pthread_cond_t mycond=PTHREAD_COND_INITIALIZER;
 13 Node_p allocNode(int data)
 14 {
 15     Node_p n=(Node_p)malloc(sizeof(Node));
 16     if(n==NULL)
 17     {
 18         return NULL;
 19     }
 20     n->data=data;
 21     n->next=NULL;
 22     return n;
 23 }
 24 
 25 void Init(Node_pp list)
 26 {
 27     *list=allocNode(0);
 28     if(_n==NULL)
 29     {
 30        return NULL;
 31     }
 32 }
 33 
 34 void PushFront(Node_p list ,int data)
 35 {
 36     assert(list);
 37     Node_p n=allocNode(data);
 38     if(n==NULL)
 39     {
 40         perror("Push");
 41         return;
 42     }
 43 
 44     n->next=list->next;
 45     list->next=n;
 46 }
 47 
 48 void delNode(Node_p del)
 49 {
 50     assert(del);
 51     free(del);
 52 }
 53 
 54 void PopFront(Node_p list,int *data)
 55 {
 56     if(!isEmpty(list))
 57     {
 58         Node_p del=list->next;
 59         list->next=del->next;
 60         *data=del->data;
 61         delNode(del);
 62     }
 63     else {
 64         printf("list IS Empty\n");
 65     }
 66 }
 67 
 68 int isEmpty(Node_p list)
 69 {
 70     assert(list);
 71     if(list->next==NULL)
 72          return 1;
 73     else
 74          return 0;
 75 }
 76 
 77 void destroy(Node_p list)
 78 {
 79     int data;
 80     assert(list);
 81     while(!isEmpty(list))
 82     {
 83         PopFront(list,&data);
 84     }
 85     delNode(list);
 86 }
 87 
 88 void ShowList(Node_p list)
 89 {
 90     assert(list);
 91     Node_p cur=list->next;
 92      while(cur->next)
 93     {
 94          printf("%d->",cur->data);
 95          cur=cur->next;
 96     }
 97     printf("\n");
 98 }
 99 

103 
104 void * Consumer(void *arg)
105 {
106     int data=0;
107     while(1)
108     {
109         pthread_mutex_lock(&mylock);
110          while(isEmpty(list))
111          {
112             pthread_cond_wait(&mycond,&mylock);
113           }
114         PopFront(list,&data);
115         pthread_mutex_unlock(&mylock);
116         printf("consumer:%d\n",data);
117     }
118         return NULL;
119 }
120 
121 void * Producer(void *arg)
122 {
123     int data=0;
124     while(1)
125     {
126         usleep(100000);
127         data=rand()%100+1;
128         pthread_mutex_lock(&mylock);
129         PushFront(list,data);
130         pthread_mutex_unlock(&mylock);
131         pthread_cond_signal(&mycond);
132         printf("Producer:%d\n",data);
133      }
134         return NULL;
135 }
136 
137 int main()
138 {
139     Init(&list);
140     pthread_t tid1,tid2;
141     pthread_create(&tid1,NULL,Consumer,NULL);
142     pthread_create(&tid2,NULL,Producer,NULL);
143     pthread_join(tid1,NULL);
144     pthread_join(tid2,NULL);
145     destroy(list);
146     pthread_mutex_destroy(&mylock);
147     pthread_cond_destroy(&mycond);
148     return 0;
149 }

运行结果:
这里写图片描述

2、基于循环队列模式下的生产者与消费者模型

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页