生产者消费者c语言条件变量实现

问题描述

一组生产者线程和一组消费者线程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入消息,或者一个消费者从中取出消息。

问题分析

  1. 关系分析。生产者和消费者对缓冲区互斥访问是互斥关系,同时生产者和消费者又是一个相互协作的关系,只有生产者生产之后,消费者才能消费,他们也是同步关系。

  2. 整理思路。这里比较简单,只有生产者和消费者两种线程,正好是多个线程存在着互斥关系和同步关系。那么需要解决的是互斥和同步PV操作的位置。

  3. 模拟问题。使用队列模拟缓冲区,生产者与消费者用独立线程模拟。

  4. 实现同步。锁mutex,用于控制互斥访问缓冲池以及与条件变量配合使用;条件变量cond用于消费者记录当前缓冲池中是否非空。条件变量cond1用于生产者记录当前缓冲池中是否已满。

核心代码

void *producer(void *a)
{
    while(1){
        pthread_mutex_lock(&mutex);
        while(full(&pc)==1){
            printf("生产者%ld等待中\n",pthread_self());
            pthread_cond_wait(&cond,&mutex);
        }
        produce(&pc);
        printf("生产者%ld生产%d\n",pthread_self(),pc.tail->date);
        if(pc.len==1){
            pthread_cond_signal(&cond);
        }
        pthread_mutex_unlock(&mutex);
        sleep(1);
    }
}
void *consumer(void *a)
{
    while(1){
        pthread_mutex_lock(&mutex);
        while(empty(&pc)==1){
            printf("\t\t\t消费者%ld等待中\n",pthread_self());
            pthread_cond_wait(&cond,&mutex);
        }
        printf("\t\t\t消费者%ld消费%d\n",pthread_self(),pc.head->date);
        consume(&pc);
        if(pc.len==5){
            pthread_cond_signal(&cond1);
        }
        pthread_mutex_unlock(&mutex);
        sleep(1);
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值