码迷,mamicode.com
首页 > 其他好文 > 详细

实现同步与互斥的一个实例--生产者消费模型

时间:2016-04-23 01:49:24      阅读:327      评论:0      收藏:0      [点我收藏+]

标签:模型   生产者   

1.基础知识

 1).生产者消费模型中存在3种关系:

    a.生产者与生产者之间是互斥的;

    b.消费者与消费者之间是互斥的;

    c.生产者与消费者之间是同步与互斥的;

 2).生产者与消费者的场所,这儿我们选择单链表。


2.内容:多生产者生产一个结构体串在链表的表尾上,多消费者从表头取走结构体。

3.代码实现

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<pthread.h>
  4 
  5 typedef struct list
  6 {
  7     int _data;
  8     struct list* _next;
  9 }product_list;
 10 product_list* head=NULL;
 11 
 12 static pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;  //加锁
 13 static pthread_cond_t need_product=PTHREAD_COND_INITIALIZER;
 14 
 15 product_list* createNode(int data)
 16 {
 17     product_list* tmp=malloc(sizeof(product_list));
 18     tmp->_data=data;
 19     tmp->_next=NULL;
 20     return tmp;
 21 }
 22 void InitList(product_list** pHead)    //&引用
 23 {
 24     *pHead=createNode(0);
 25 }
 26 void PushBack(product_list* pHead,int data)
 27 {
 28         product_list* tail=pHead;
 29         while(tail->_next!=NULL)
 30         {
 31             tail=tail->_next;
 32         }
 33         product_list* new=createNode(data);
 34         tail->_next=new;
 35         printf("product data is:%d\n",new->_data);
 36 }
 37 void PopFront(product_list* pHead)
 38 {
 39         product_list* tmp=pHead->_next;
 40     //  product_list* tmp=pHead;
 41         pHead->_next=pHead->_next->_next;
 42         pHead=pHead->_next;
 43         tmp->_next=NULL; //遗忘
 44         printf("consumer data is:%d\n",tmp->_data);
 45         free(tmp);//遗忘
 46         tmp=NULL;
 47 }
 48 void* product(void* arg)
 49 {
 50     int i=0;
 51     for(;i<10;i++)
 52     {
 53         pthread_mutex_lock(&lock);
 54         PushBack(head,i);
 55         pthread_mutex_unlock(&lock);
 56         pthread_cond_signal(&need_product);
 57         printf("call consumer!product success!\n");
 58         sleep(1);
 59     }
 60 }
 61 void* consumer(void* arg)
 62 {
 63     while(1)
 64     {
 65         pthread_mutex_lock(&lock);
 66         while(head->_next==NULL)
 67         {
 68             pthread_cond_wait(&need_product,&lock);
 69         }
 70         PopFront(head);
 71         pthread_mutex_unlock(&lock);
 72         printf("comsumer success!\n");
 73     }
 74     return NULL;
 75 }
 76 int main()
 77 {
 78     InitList(&head);
 79     pthread_t product1;
 80     pthread_t product2;
 81     pthread_t product3;
 82     pthread_t consumer1;
 83     pthread_t consumer2;
 84     pthread_t consumer3;
 85 
 86     pthread_create(&product1,NULL,product,NULL);
 87     pthread_create(&product2,NULL,product,NULL);
 88     pthread_create(&product3,NULL,product,NULL);
 89     pthread_create(&consumer1,NULL,consumer,NULL);
 90     pthread_create(&consumer2,NULL,consumer,NULL);
 91     pthread_create(&consumer3,NULL,consumer,NULL);
 92 
 93     pthread_join(product1,NULL);
 94     pthread_join(product2,NULL);
 95     pthread_join(product3,NULL);
 96     pthread_join(consumer1,NULL);
 97     pthread_join(consumer2,NULL);
 98     pthread_join(consumer3,NULL);
 99 
100     return 0;
101 }

//makefile
  1 test:test.c
  2     gcc -o $@ $^ -lpthread
  3 .PHONY:clean
  4 clean:
  5     rm -f test

输出结果:

技术分享


本文出自 “sunshine225” 博客,请务必保留此出处http://10707460.blog.51cto.com/10697460/1766910

实现同步与互斥的一个实例--生产者消费模型

标签:模型   生产者   

原文地址:http://10707460.blog.51cto.com/10697460/1766910

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!