真实的生产者-消费者模型

14 篇文章 0 订阅
13 篇文章 0 订阅

先说点其他的,pthread_cond_wait(cond, lock)在语义上等于pthread_mutex_unlock(lock), pthread_cond_wait(cond), pthread_mutex_lock(lock),但却不能拆开运行,在第一句和第二句之间有可能会错失信号。

下面是一个真实的模型,这个模型中有一个producer和多个consumer,producer有生产限制和结束标志,为简化过程,producer和consumer等待在一个条件变量上。

void producer()
{
    pthread_mutex_lock(&res_lock);
    while (RES.count == RES.MAX) {
        pthread_cond_wait(&res_cond, &res_lock);
    }
    Produce(&RES);
    if (RES.count == 1) {
        pthread_cond_broadcast(&res_cond);
    }
    pthread_cond_unlock();
}

void consumer()
{
    pthread_mutex_lock(&res_lock);
    while (!RES.nomore && RES.count == 0) {
        pthread_cond_wait(&res_cond, &res_lock);
    }
    pthread_cond_broadcast(&res_cond);
    if (RES.nomore && RES.count == 0) {
        pthread_mutex_unlock(&res_lock);
        return;
    }
    Consume(&RES);
    pthread_mutex_unlock(&res_lock);
}

当producer的产量达到RES.MAX最大限制时,便等待在res_cond上。当producer生产完全结束时,将RES.nomore置为true。如果producer生产完全结束,consumer会结束条件测试并退出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值