如何通过条件变量实现高效的生产者消费者模型?

2026-06-10 03:103阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计471个文字,预计阅读时间需要2分钟。

如何通过条件变量实现高效的生产者消费者模型?

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


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


#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;
}

如何通过条件变量实现高效的生产者消费者模型?

本文共计471个文字,预计阅读时间需要2分钟。

如何通过条件变量实现高效的生产者消费者模型?

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


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


#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;
}

如何通过条件变量实现高效的生产者消费者模型?