zoukankan      html  css  js  c++  java
  • 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);
    }
    

      

  • 相关阅读:
    位运算简介以及常用技巧
    JMeter 十六:加密处理
    JMeter 十五:函数以及变量
    JMeter 十四:最佳实践
    JMeter 十三:生成 report dashboard
    JMeter 十二:命令行执行
    JMeter 十一:参数化
    JMeter 十:录制脚本--使用bodboy
    LoadRunner录制:检查点
    LoadRunner录制: 选择协议
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/15420977.html
Copyright © 2011-2022 走看看