我们用两个线程分别表示生产者与消费者,用单链表表示缓冲区。
生产者生产数据,插入到单链表的头部。
消费者消费数据,从单链表的头部读数据。
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
typedef struct palce_t
{
struct palce_t *next;
int data;
}place;
place *head=NULL;
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t need_product = PTHREAD_COND_INITIALIZER;
void palce_init(place *p)
{
if(p!=NULL){
p->next=NULL;
p->data=0;
}
}
void *consumer(void * val)
{
place *p=NULL;
while(1){
pthread_mutex_lock(&lock);
while(head==NULL){
pthread_cond_wait(&need_product,&lock);
}
p=head;
head=head->next;
p->next=NULL;
pthread_mutex_unlock(&lock);
printf("consumer !data=%d\n",p->data);
free(p);
sleep(1);
}
}
void* Product(void* _val)
{
while(1){
sleep(1);
place *p=malloc(sizeof(place));
pthread_mutex_lock(&lock);
palce_init(p);
p->next=head;
p->data=rand()%1000;
head=p;
pthread_mutex_unlock(&lock);
printf("Call consumer!data=%d\n",p->data);
pthread_cond_signal(&need_product);
}
}
int main ()
{
pthread_t t1;
pthread_t t2;
pthread_create(&t1,NULL,consumer,NULL);
pthread_create(&t2,NULL,Product,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
return 0;
}