一、实验目的
通过生产者—消费者例子,熟悉、掌握互斥同步编程。
二、实验内容
模拟实现生产者—消费者例子,当生产者生产了某种产品后,消费者才可以消费该产品,缓冲区里没有个数限制,并且生产者和消费者是两个独立的线程,所以生产者可以一直生产产品,消费者可以消费生产者生产的任意产品。生产者和消费者线程既要同步也需要互斥。
三、实验代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
struct msg
{
int num;
struct msg * next;
};
struct msg * head;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void * consumer(void * pVoid)
{
struct msg * mp;
struct msg * mpp;
while (1)
{
pthread_mutex_lock(&mutex);
if (NULL == head)
pthread_cond_wait(&cond, &mutex);
mp = head;
if (mp -> next)
{
while (mp -> next)
{
mpp = mp;
mp = mp -> next;
}
printf("Consume %d\n", mp -> num);
free(mp);
mpp -> next = mp = NULL;
} else {
printf("Consume %d\n", mp -> num);
free(mp);
head = mp = NULL;
}
pthread_mutex_unlock(&mutex);
sleep(2);
}
return pVoid;
}
void * producer(void * pVoid)
{
struct msg * mp;
while (1)
{
mp = (struct msg *)malloc(sizeof(struct msg));
mp -> num = rand()%1000 + 1;
printf("Produce %d\n", mp -> num);
pthread_mutex_lock(&mutex);
mp -> next = head;
head = mp;
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&cond);
sleep(1);
}
return pVoid;
}
int main(void)
{
pthread_t pid;
pthread_t cid;
head = NULL;
int err;
err = pthread_create(&pid, NULL, producer, "producer");
if (0 != err)
{
fprintf(stderr, "create thread1 faild:.....!%s\n", strerror(err));
return -1;
}
err = pthread_create(&cid, NULL, consumer, "consumer");
if (0 != err)
{
fprintf(stderr, "creat thread2 failed:......!%s\n", strerror(err));
return -1;
}
pthread_join(pid, NULL);
pthread_join(cid, NULL);
return 0;
}