生产者与消费者模型

9人阅读 评论(0) 收藏 举报
分类:

一、生产与消费者模型

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、基于循环队列模式下的生产者与消费者模型

查看评论

例说生产者和消费者模型

什么是生产者和消费者模型什么是生产者消费者模型?生产者和消费是操作系统中一种重要的模型,它描述的是一种等待和通知的机制,如下图。 生产者和消费者模型必须具有的条件用一句话概括,生产者消费者模型必...
  • bit_clearoff
  • bit_clearoff
  • 2017-02-19 17:14:29
  • 2027

生产者消费者模型你知道多少

进入正题之前先说点故事。从最开始学java的那里开始:我是从08年下半年开始学Java,在《我的六年程序之路》中提到了一些。当时比较简单,每天看尚学堂的视频(对于初学者而言看视频好一些。),然后写代码...
  • luohuacanyue
  • luohuacanyue
  • 2013-11-12 08:07:10
  • 34509

手写一个生产者--消费者模型例子

在并发编程中,比较经典的编程例子就是生产者和消费者模型。下面就是一个例子来诠释一下什么是生产者和消费者以及他们的特点和注意点。1、先定义一个数据对象,public class Data { p...
  • qq_27603235
  • qq_27603235
  • 2017-06-26 21:52:56
  • 1679

生产者消费者模型(Linux系统下的两种实现方法)

生产者消费者问题是同步问题中的一种常见情况,借用一下维基百科的话 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer ...
  • yusiguyuan
  • yusiguyuan
  • 2015-09-07 14:32:19
  • 3692

通过阻塞队列实现生产者消费者模型

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。这篇文章我们来看看什么是生产者消费者模式,这个问...
  • junjianzhang
  • junjianzhang
  • 2015-04-11 22:33:04
  • 1339

13、生产者消费者模型_两种实现方式

wait()、notify()和notifyAll()是Object类中的方法: 1 2 3 4 5 6 7 8 9 ...
  • u010796790
  • u010796790
  • 2016-08-12 19:20:28
  • 523

线程同步经典案例-生产者与消费者模型-Java

一、相关知识简介      在生产者-消费者模型中,若只使用synchronized关键字实现对象锁,程序在运行中可能会出现以下两种情况: 若生产者的速度大于消费者,那么在消费者来不及取前一个数据之前...
  • Xminyang
  • Xminyang
  • 2016-11-18 15:58:44
  • 1364

C++11多线程(十六):实战-生产者消费者模型

参考链接:http://www.cnblogs.com/haippy/p/3252092.html 不错的博客 目录 1.单生产者-单消费者模型 2.单生产者-多消费者模型 3.多生产...
  • ceasadan
  • ceasadan
  • 2016-01-06 15:57:14
  • 881

[Linux]生产者与消费者 三种模型 C

“生产者/消费者”问题描述: 有一个有限缓冲区和两个线程:生产者和消费者。他们分别把产品放入缓冲区和从缓冲区中拿走产品。当一个生产者在缓冲区满时必须等待,当一个消费者在缓冲区空时也必须等待。 ...
  • z354681250
  • z354681250
  • 2016-06-09 23:25:07
  • 2316
    个人资料
    持之以恒
    等级:
    访问量: 2541
    积分: 514
    排名: 9万+
    文章存档