#iinclude <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
struct Msg //共享数据
{
int num;
struct Msg *next;
};
struct Msg *head;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //定义并初始化一个互斥量
pthread_cond_t has_data = PTHREAD_COND_INITIALIZER; //定义并初始化一个条件变量
void err_thread(int ret,char *str)
{
if(ret != 0){
fprintf(stderr,"%s:%s\n",str,strerror(ret));
pthread_exit(NULL);
}
}
void *produser(void *arg) //生产者
{
while(1){
struct Msg *food = (struct Msg *)malloc(sizeof(struct Msg)); //生产一个食物
food->num = rand() % 1000 + 1; //初始化食物,模拟生产了一个数据
printf("--produser %d\n",food->num);
pthread_mutex_lock(&mutex); //加锁
food->next = head; //写公共区域
head = food;
pthread_mutex_unlock(&mutex); //解锁
pthread_cond_signal(&has_data); //唤醒阻塞在条件变量 has_data上的线程
sleep(rand() % 3);
}
}
void *consumer(void *arg) //消费者
{
struct Msg *food;
while(1){
pthread_mutex_lock(&mutex); //加锁 互斥量
if(head == NULL){
pthread_cond_wait(&has_data,&mutex); //阻塞等待条件变量,解锁
} //pthread_cond_wait 返回时,重新加锁
food = head;
head = food->next;
pthread_mutex_unlock(&mutex); //解锁
printf("-------------------consumer:%d\n",food->num);
free(food);
sleep(rand() % 3);
}
}
int main()
{
int ret;
pthread_t pid,cid;
srand(time(NULL));
ret = pthread_create(&pid,NULL,produser,NULL); //生产者线程
if(ret != 0){
err_thread(ret,"pthread_creat error");
}
ret = pthread_create(&cid,NULL,consumer,NULL); //消费者线程
if(ret != 0){
err_thread(ret,"pthread_creat error");
}
pthread_join(pid,NULL);
pthread_join(cid,NULL);
return 0;
}