Android C++多线程

Android C++ 线程简介

我们都知道Android是基于Linux内核的,而Linux是遵循POSIX线程标准的,POSIX线程库中有

一系列Pthreads API方便我们对Linux线程的操作。所以我们在Android中使用C/C++线程也就转到

了使用POSIX线程库。他们都在头文件“pthread.h”中。

创建子线程

1、pthread_t:
用于声明一个线程对象如:pthread_t thread;
2、pthread_creat :
用于创建一个实际的线程如:pthread_create(&pthread,NULL,threadCallBack,NULL);其总共接收4个参数,第一个参数为pthread_t对象,第二个参数为线程的一些属性我们一般传NULL就行,第三个参数为线程执行的函数( void* threadCallBack(void data) ),第四个参数是传递给线程的参数是void类型的既可以传任意类型。
3、pthread_exit :
用于退出线程如:pthread_exit(&thread),参数也
可以传NULL。注:线程回调函数最后必须调用此方法,不然APP
会退出(挂掉)。

生产者和消费者模型

1、pthread_mutex_t :用于创建线程锁对象如:pthread_mutex_t mutex;
2、pthread_mutex_init :用于初始化pthread_mutex_t锁对象如:
pthread_mutex_init(&mutex, NULL);
3、pthread_mutex_destroy :用于销毁pthread_mutex_t锁对象如:
pthread_mutex_destroy(&mutex);
4、pthread_cond_t :用于创建线程条件对象如:pthread_cond_t cond;
5、pthread_cond_init :用于初始化pthread_cond_t条件对象如:
pthread_cond_init(&cond, NULL);
6、pthread_cond_destroy :用于销毁pthread_cond_t条件对象如:
pthread_cond_destroy(&cond);
7、pthread_mutex_lock :用于上锁mutex,本线程上锁后的其他变量是不能
被别的线程操作的如:pthread_mutex_lock(&mutex);
8、pthread_mutex_unlock :用于解锁mutex,解锁后的其他变量可以被其他线程操作
如:pthread_mutex_unlock(&mutex);
9、pthread_cond_signal :用于发出条件信号如:pthread_cond_signal(&mutex, &cond);
10、pthread_cond_wait :用于线程阻塞等待,直到pthread_cond_signal发出条件信号后
才执行退出线程阻塞执行后面的操作。

创建普通线程


/**
 * 创建普通线程
 */
#include "pthread.h"

pthread_t pthread;

//普通线程的回调
void *normalCallBack(void *data) {
    LOGI("create normal thread from c++");
    pthread_exit(&pthread);
}

extern "C"
JNIEXPORT void JNICALL
Java_com_vision_mymusic2_MainActivity_normalThread(JNIEnv *env, jobject instance) {
    pthread_create(&pthread, NULL, normalCallBack, NULL);
}
2019-03-14 14:23:34.336 16182-16219/com.vision.mymusic2 I/zhangyu: create normal thread from c++

生产者消费者模型

/**
 * 创建线程锁
 */
#include "queue"
#include "unistd.h"

pthread_t produc;
pthread_t custom;
pthread_mutex_t mutex;
pthread_cond_t cond;
std::queue<int> queue;
bool isExit = false;

void *productCallBack(void *data) {
    //循环生产
    while (!isExit) {
        pthread_mutex_lock(&mutex);//生产数据的时候,不允许消费
        queue.push(1);//生产数据
        LOGE("添加一条数据,通知消费者消费,产品数量为:%d", queue.size());
        pthread_cond_signal(&cond);//通知消费者
        pthread_mutex_unlock(&mutex);//解锁
        sleep(5);//单位秒
    }
    pthread_exit(&produc);
}

void *customCallBack(void *data) {
    //循环消费
    while (!isExit) {
        pthread_mutex_lock(&mutex);//同理,消费数据的时候,不允许添加数据
        if (queue.size() > 0) {
            queue.pop();//当上面生产处于锁定时,则不执行,解锁后执行
            LOGE("消费一条数据,产品数量为:%d", queue.size());

        } else {
            //没有数据的时候,等待...
            LOGE("没有数据的时候,等待...");
            pthread_cond_wait(&cond, &mutex);//等待的时候,锁是自动解开的。
        }
        pthread_mutex_unlock(&mutex);//解锁
        usleep(1000 * 500);//单位,微秒,500毫秒,0.5秒
    }
    pthread_exit(&custom);
}

extern "C"
JNIEXPORT void JNICALL
Java_com_vision_mymusic2_MainActivity_mutexThread(JNIEnv *env, jobject instance) {
    for (int i = 0; i < 10; i++) {
        queue.push(i);
    }
    //初始化
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);
    //创建
    pthread_create(&produc, NULL, productCallBack, NULL);
    pthread_create(&custom, NULL, customCallBack, NULL);
}
2019-03-14 14:23:44.337 16182-16221/com.vision.mymusic2 I/zhangyu: 添加一条数据,通知消费者消费,产品数量为:1
2019-03-14 14:23:44.877 16182-16222/com.vision.mymusic2 I/zhangyu: 消费一条数据,产品数量为:0
2019-03-14 14:23:45.403 16182-16222/com.vision.mymusic2 I/zhangyu: 没有数据的时候,等待...
2019-03-14 14:23:49.371 16182-16221/com.vision.mymusic2 I/zhangyu: 添加一条数据,通知消费者消费,产品数量为:1
2019-03-14 14:23:49.888 16182-16222/com.vision.mymusic2 I/zhangyu: 消费一条数据,产品数量为:0
2019-03-14 14:23:50.421 16182-16222/com.vision.mymusic2 I/zhangyu: 没有数据的时候,等待...
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值