线程同步与条件变量-课后练习
我要参与
线程同步与条件变量-课后练习
学习任务 2.4k
等11人参与

示例

基于条件变量实现生产者与消费者模型(多个生产者对应一个消费者)

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


static int number = 0;//共享变量

static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;

static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void *thread_handler(void *arg)
{
    int cnt = atoi((char *)arg);
    int i,tmp;

    for(i = 0;i < cnt;i++){

        pthread_mutex_lock(&mtx);

        printf("线程 [%ld] 生产一个产品,产品数量为:%d\n",pthread_self(),++number);

        pthread_mutex_unlock(&mtx);
        pthread_cond_signal(&cond); // 唤醒消费者线程
    }

    pthread_exit((void *)0);
}



int main(int argc,char *argv[])
{
    pthread_t tid;
    int i;
    int err;
    int total_of_produce = 0;//总的生产产品的数量
    int total_of_consume = 0;//总的消费产品的数量
    bool done = false;

    for (i = 1;i < argc;i++){
        total_of_produce += atoi(argv[i]); // 生产数量的总和
        err = pthread_create(&tid,NULL,thread_handler,(void *)argv[i]);
        if (err != 0){
            perror("[ERROR] pthread_create(): ");
            exit(EXIT_FAILURE);
        }
    }


    for (;;){
        pthread_mutex_lock(&mtx);

        while(number == 0) // 当产品数量为 0时,让线程阻塞,并释放锁,这里一般设置循环,防止没有重新获取到锁
            pthread_cond_wait(&cond,&mtx);

        while(number > 0){
            total_of_consume++; // 消费产品总数
            printf("消费一个产品,产品数量为:%d\n",--number);
            done = total_of_consume >= total_of_produce; // 判断消费者数量与产品数量
        }

        pthread_mutex_unlock(&mtx); // 消费者消费完成之后,释放锁

        if (done)
            break;
    }

    

运行结果

程 [139950703310592] 生产一个产品,产品数量为:1
消费一个产品,产品数量为:0
线程 [139950703310592] 生产一个产品,产品数量为:1
消费一个产品,产品数量为:0
线程 [139950703310592] 生产一个产品,产品数量为:1
消费一个产品,产品数量为:0
线程 [139950720096000] 生产一个产品,产品数量为:1
消费一个产品,产品数量为:0
线程 [139950711703296] 生产一个产品,产品数量为:1
线程 [139950711703296] 生产一个产品,产品数量为:2
消费一个产品,产品数量为:1
消费一个产品,产品数量为:0

练习

实现多个生产者与多个消费者模型,在示例的基础上进行修改,提示,需要使用 pthread_cond_broadcast 函数唤醒所有阻塞的消费者线程

去发布

登录后即可发布作业,立即

我的作业

全部作业

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师