• posix实现最简单的生产者消费者模型


    一、概述

      案例:使用posix线程模型,实现一个最简单的生产者消费者模型。用一个全局的int类型的变量来表示产品。用一个生产者线程生产产品,初始产品数量为0,只有当生产10个产品的时候,消费者线程才会启动,开始消费。

         当消费者线程把产品消费完(产品数为0)的时候通知生产者继续生产产品,生产到10个再通知消费者线程开始消费,如此循环往复的实现生产者消费者模型。

    二、示例图片

    三、示例代码(代码是在AndroidStudio中写的,要是需要再Linux中做测试,记得在main方法中执行executeThread)

    //
    // Created by wei.yang on 2021/10/15.
    //
    #include "pcmode.h"
    
    pthread_mutex_t lock;
    pthread_cond_t cond1, cond2;
    int product = 0;
    
    /**
     * 生产数据:如果生产的数据大于10个就不再生产
     */
    void *producer(void *) {
        while (1) {
            pthread_mutex_lock(&lock);
            while (1) {
                ++product;
                LOGE("生产产品:%d", product);
                sleep(1);
    
                if (product >= 10) {
                    //发送信号给消费者
                    pthread_cond_signal(&cond2);
                    //收到信号后退出内层循环,解锁锁定的线程,重新进入大循环开始生产产品
                    pthread_cond_wait(&cond1, &lock);
                    break;
                }
    
            }
            pthread_mutex_unlock(&lock);
    
    
        }
    
    
    }
    
    /**
     * 消费数据
     */
    void *consumer(void *) {
        while (1) {
            pthread_mutex_lock(&lock);
            for (;;) {
                LOGE("消费产品:%d", product);
                --product;
                sleep(1);
                if (product <= 0) {
                    //产品数为0通知生产者线程生产产品
                    pthread_cond_signal(&cond1);
                    //收到信号后后跳转循环,并解锁。重新进入大循环开始消费产品
                    pthread_cond_wait(&cond2, &lock);
                    break;
                }
    
    
    
            }
            pthread_mutex_unlock(&lock);
    
    
        }
    }
    
    /**
     * 执行线程
     */
    void executeThread() {
        //初始化线程id
        pthread_t pt1, pt2;
        //初始化互斥锁
        pthread_mutex_init(&lock, NULL);
        //初始化条件变量
        pthread_cond_init(&cond1, NULL);
        pthread_cond_init(&cond2, NULL);
        //创建线程
        pthread_create(&pt1, NULL, producer, NULL);
        pthread_create(&pt2, NULL, consumer, NULL);
    
        //线程执行结束后调用
        pthread_join(pt1, NULL);
        pthread_join(pt2, NULL);
        //销毁互斥锁
        pthread_mutex_destroy(&lock);
        //销毁条件变量
        pthread_cond_destroy(&cond1);
        pthread_cond_destroy(&cond2);
    }
    

      

  • 相关阅读:
    jdk1.8安装与配置
    java编译器——idea的安装
    原型设计作业
    案例分析作业
    202103226-1 编程作业
    阅读任务
    准备工作
    java课程总结
    第十四周总结
    第十三周总结
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/15420977.html
Copyright © 2020-2023  润新知