美文网首页
2-ndk学习之c++基础篇(06)

2-ndk学习之c++基础篇(06)

作者: ftd黑马 | 来源:发表于2020-03-12 15:48 被阅读0次

这篇文章写一下c++经典案例,生产者消费者模式,我在代码中的注释写的很详细,这边就不多写了,干货哦!!!
工具类代码如下:

//
// Created by guow on 2020/3/12.
//

#ifndef CPPPROJECT_QUEUE_UTIL_H
#define CPPPROJECT_QUEUE_UTIL_H

#endif //CPPPROJECT_QUEUE_UTIL_H

#pragma once

#include <iostream>
#include <queue>
#include <string>
using namespace std;

//1.首先定义一个模板
template <typename T>

class SafeQueueClass{
private:
    queue<T> queue1;    //定义队列
    pthread_mutex_t mutex1;//定义互斥锁,为了线程安全处理(不允许有野指针,所以在构造函数中需要初始化)
    //定义一个条件变量,为了实现等待   读取的功能,类似于java中的wait,notify(同样也是不允许有野指针)
    pthread_cond_t cond;

public:
    SafeQueueClass(){
        //初始化互斥锁
        pthread_mutex_init(&mutex1,0);

        //初始化条件变量
        pthread_cond_init(&cond,0);
    }

    //在析构函数中进行回收操作
    ~SafeQueueClass(){
        //回收互斥锁
        pthread_mutex_destroy(&mutex1);
        //回收条件变量
        pthread_cond_destroy(&cond);
    }

    /**
     * 生产者(把数据加入队列中)
     * @param t
     */
    void add(T t){
        //为了保证同步的安全性,所以一进来就先锁上
        pthread_mutex_lock(&mutex1);

        queue1.push(t);

        //添加上要唤醒消费者中的等待模式,否则消费者一直在等待
//        pthread_cond_signal(&cond);//由系统去唤醒一个线程,类似于java的notify
        pthread_cond_broadcast(&cond);//唤醒通知所有线程,类似于java的notifyAll

        //同时函数执行完要释放锁
        pthread_mutex_unlock(&mutex1);
    }


    /**
     * 消费者,从队列中获取数据
     */
    void get(T& t){//这里是c++独有的引用类型,不清楚的可以看我之前的文章有介绍过引用类型,引用可以把值传出去
        //为了保证同步的安全性,所以一进来就先锁上
        pthread_mutex_lock(&mutex1);

        //这里不能使用if,如果使用if,线程可能会被系统唤醒,就往下执行了肯定有问题
        while (queue1.empty()){
            //条件变量用来等待,如果队列是空的说明还没有生产,所以消费者要等待
            pthread_cond_wait(&cond,&mutex1);
        }

        //程序走到这里说明队列有数据了,可以进行消费了
        t = queue1.front();
        queue1.pop();//把数据从队列删除


        //同时函数执行完要释放锁
        pthread_mutex_unlock(&mutex1);
    }
};

在main函数调用如下:

//
// Created by guow on 2020/3/12.
//

#pragma once

#include <iostream>
#include "main.h"

#include "mylog.h"
#include <queue>
#include <pthread.h>
#include <string>
#include "queue_util.h"

using namespace std;

SafeQueueClass<int> sq;

//消费者
void * getMethod(void * pVoid) {
    while(9) {
        LOGD("getMethod\n");

        int value;
        sq.get(value);
        LOGD("消费者get 得到的数据:%d\n", value);

        // 你只要输入 -1 就结束当前循环
        if (-1 == value) {
            LOGD("消费者get 全部执行完毕...");
            break;
        }
    }
    //这里必须return,否则会出现问题
    return 0;
}

// 生产者
void * addMethod(void * pVoid) {
    while (9) {
        LOGD("setMethod\n");

        int value;
        LOGD("请输入您要的信息....\n");
        cin >> value;
        // 你只要输入 -1 就结束当前循环
        if (-1 == value) {
            sq.add(value); // 这里添加是为了,让消费者,可以获得-1,进行停止
            LOGD("生产者set 全部执行完毕...");
            break;
        }
        sq.add(value);
    }
    return 0;
}

int main() {

    pthread_t pthread_add;
    pthread_create(&pthread_add,0,addMethod,0);

    pthread_t pthread_get;
    pthread_create(&pthread_get,0,getMethod,0);

    pthread_join(pthread_add,0);
    pthread_join(pthread_get,0);

    return 0;
}

至此,c++的学习之路先告一段落,后续开始jni的学习之路,如果有不对的地方,希望大家在评论区多多指正,共同学习,谢谢大家。

相关文章

  • 2-ndk学习之c++基础篇(06)

    这篇文章写一下c++经典案例,生产者消费者模式,我在代码中的注释写的很详细,这边就不多写了,干货哦!!!工具类代码...

  • 2-ndk学习之c++基础篇(05)

    文件操作 首先是c语言读取文件:需要先添加头文件, 然后是c++读取文件:先添加头文件: 多线程入门 c++的多线...

  • 2-ndk学习之c++基础篇(1)

    c++是在c的基础上进行封装的,数据类型基本上都差不多,最大的差异就表现在c++是面向对象的语言,在c++中,有c...

  • 2-ndk学习之c++基础篇(02)

    由于clion有时间过期的限制,从这篇文章开始,之后所有的代码都在as上敲写学习了。 as上新建一个c++项目 新...

  • 2-ndk学习之c++基础篇(03)

    在c++源码中,会有很多俗称“鬼画符”的代码,很多都是用到了运算符重载 运算符重载 在函数中调用: 继承 在mai...

  • 2-ndk学习之c++基础篇(04)

    容器 c++中的容器分为两种:1.序列化容器,元素的排序关系,和元素本身没有任何关系,是我们在添加的时候的顺序导致...

  • c++学习笔记之基础篇

    c++学习笔记系列:http://blog.csdn.net/column/details/17301.html ...

  • HIDL实战笔记

    目录 第一篇:HIDL学习笔记之HIDL C++(第一天)第二篇:HIDL学习笔记之HIDL C++(第二天)第三...

  • 从零开始学C#--一些其它的问题

    本篇属于:从零开始学C# | 基础篇 | 06 到本篇为止,C#的基础篇就完结了,即将进入到面向对象的学习。 关于...

  • C++ 总结 (一、基础篇)

    C++ 总结 (一、基础篇) 官网 C++ 完全兼容C语言,但是有自己的语法特点,本文总结了C++的基础知识。记录...

网友评论

      本文标题:2-ndk学习之c++基础篇(06)

      本文链接:https://www.haomeiwen.com/subject/oqzujhtx.html