当前位置 : 主页 > 编程语言 > java >

条件变量实现生产者消费者模型

来源:互联网 收集:自由互联 发布时间:2022-08-15
同条件变量和互斥锁实现生产者和消费者模型 #includestdio.h #includeunistd.h #includepthread.h #includestdlib.h //利用链表模拟共享资源 struct msg { struct msg * next ; int num ; }; struct msg * head = NULL ; struc


同条件变量和互斥锁实现生产者和消费者模型


#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
#include<stdlib.h>

//利用链表模拟共享资源
struct msg
{
struct msg *next;
int num;

};

struct msg *head=NULL;
struct msg *mp=NULL;
//静态初始化
//互斥锁的初始化
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
//条件变量的初始化
pthread_cond_t has_product=PTHREAD_COND_INITIALIZER;
//生产者线程函数
void*producter(void*arg)
{
while(1)
{
//生产产品
mp=malloc(sizeof(struct msg));
mp->num=rand()%400+1;
printf("---producter---%d\n",mp->num);

//加锁,修改共享数据,解锁
pthread_mutex_lock(&mutex);
mp->next=head;
head=mp;
pthread_mutex_unlock(&mutex);
//释放信号,唤醒在条件量上的线程
pthread_cond_signal(&has_product);

//增加时长,使得cpu易主
sleep(rand()%4);
}
return NULL;
}
//消费者线程函数
void*consumer(void*arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
//头指针若不为空,pthread_cond_wait函数没有执行的必要,我锁住去消费就好
//可能同时有多个线程条件变量被唤醒,但是只有一个线程的互斥锁锁住
while(head==NULL)
{
pthread_cond_wait(&has_product,&mutex);
}
//消费掉产品
mp=head;
head=mp->next;
pthread_mutex_unlock(&mutex);

printf("-------consumer--%d\n",mp->num);
free(mp);
mp=NULL;
sleep(rand()%3);

}

return NULL;
}


int main()
{
srand(time(NULL));
//定义生产者,消费者线程ID
pthread_t p_tid,c_tid;
//创建生产者线程
pthread_create(&p_tid,NULL,producter,NULL);
//创建消费者线程
pthread_create(&c_tid,NULL,consumer,NULL);
//回收线程
pthread_join(p_tid,NULL);
pthread_join(c_tid,NULL);

return 0;
}

 

上一篇:epoll核反应堆模型
下一篇:没有了
网友评论