当前位置: 首页 > >

生产者消费者模型---C链表版本

用条件变量和操作系统的第一把锁?互斥量实现的生产者和消费者模型,其中链表的无头链表。
此模型是是基于epoll和线程池的TCP服务器的基础。


#include
#include
#include
#include
#include

// 条件变量
pthread_cond_t cond;
// 胡斥量
pthread_mutex_t mutex;

// 链表节点
typedef struct _node_t{
int data;
struct _node_t *next;

}node_t;

// 这样定义链表,是一个没有头的链表
// head一直指向最后的一个位置
node_t *head = NULL;

void *producer(void *arg)
{

// 循环生产产品
while(1)
{
// 在生产之前枷锁
pthread_mutex_lock(&mutex);
// 分配节点空间
node_t *new = malloc(sizeof(node_t));
if(NULL == new)
{
printf("malloc failed...
");
break;
}
memset(new,0,sizeof(node_t));

// 1-100
new->data = random()%100 + 1;
new->next = NULL;

// 头查法
new -> next = head;
head = new;
printf("生产了:%d
",new->data);

// 解锁
pthread_mutex_unlock(&mutex);
// 唤醒因为条件变量而阻塞的线程
pthread_cond_signal(&cond);

// 睡眠 1-3秒
sleep(random()%3+1);

}
pthread_exit(NULL);

}

void *consumer(void *arg)
{
node_t *tmp = NULL;

//循环消费
while(1)
{
pthread_mutex_lock(&mutex);
if(NULL == head)
{
// 等待
printf("链表为空
");
pthread_cond_wait(&cond,&mutex);
}

// 删除链表的第一个节点
tmp = head;
head = head->next;

printf("消费者消费%d
",tmp->data);
free(tmp);
// 解锁
pthread_mutex_unlock(&mutex);
// sleep(random()%3+1);// 睡眠1-3秒

}
pthread_exit(NULL);
}


int main()
{
// 创建两个线程
pthread_t tid1 = -1,tid2 = -2;
srandom(getpid());
// 条件变量
pthread_cond_t cond;
// 互斥量
pthread_mutex_t mutex;

int ret = -1;
ret = pthread_cond_init(&cond,NULL);
if(0 != ret)
{
printf("err cond
");
return 1;
}
ret = pthread_mutex_init(&mutex,NULL);
if(0 != ret)
{
printf("err cond
");
return 1;
}


// 创建两个线程,生产者和消费者
pthread_create(&tid1,NULL,producer,NULL);
pthread_create(&tid2,NULL,consumer,NULL);

// 等待两个线程结束
pthread_join(tid2,NULL);
pthread_join(tid1,NULL);

// 销毁条件和胡斥锁
pthread_cond_destroy(&cond);
pthread_mutex_destroy(&mutex);

return 1;

}



友情链接: year2525网 工作范文网 QS-ISP 138资料网 528200 工作范文网 baothai 表格模版