生产者-消费者问题(producer-consumer-problem)

生产者消费者问题是一个著名的线程同步问题,问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。

简化问题:假设生产者和消费者都只有一个,且缓冲区也只有一个。
利用线程、互斥量、条件变量解决生产者-消费者问题:

/*************************************************************************
    > Created Time: Thu 05 May 2016 06:26:40 AM PKT
 ************************************************************************/

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

#define MAX 10
pthread_mutex_t mutex;  //互斥量
pthread_cond_t condc,condp;  //条件变量
//条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。
int buffer=0;  //缓冲区

//生产者
void* producer(void* ptr)
{
    int i=0;
    for(i=1;i<=MAX;i++){
        pthread_mutex_lock(&mutex);
        while(buffer!=0){
            pthread_cond_wait(&condp,&mutex);
        }
        //now buffer==0
        buffer=i;
        printf("producer put %d to buffer\n",i);
        pthread_cond_signal(&condc);
        pthread_mutex_unlock(&mutex);
    }
    pthread_exit(0);
}

//消费者
void* consumer(void* ptr)
{
    int i=0;
    for(i=1;i<=MAX;i++){
        pthread_mutex_lock(&mutex);
        while(buffer==0){
            pthread_cond_wait(&condc,&mutex);
        }
        //now buffer!=0
        printf("consumer get %d from buffer\n",buffer);
        buffer=0;
        pthread_cond_signal(&condp);
        pthread_mutex_unlock(&mutex);
    }
    pthread_exit(0);
}

//测试
int main(int argc,char** argv)
{
    pthread_t pro,con;
    pthread_create(&pro,NULL,producer,NULL);
    pthread_create(&con,NULL,consumer,NULL);

    pthread_mutex_init(&mutex,NULL);
    pthread_cond_init(&condp,NULL);
    pthread_cond_init(&condc,NULL);

    pthread_join(pro,NULL);
    pthread_join(con,NULL);

    pthread_cond_destroy(&condc);
    pthread_cond_destroy(&condp);
    pthread_mutex_destroy(&mutex);
}

运行结果如下
这里写图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值