我的NDK学习开发笔记(三)

android程序开发中经常用到多线程,本篇记录多线程的创建及多线程同步

一、开发中的问题记录

1.先引入必要的文件,即#include <pthread.h>
2.创建线程pthread_create(&threads, NULL, threadStart1, (void*)i);返回值是创建线程结果,如int ret=pthread_create();当ret==0创建成功,其他均是创建失败。
1)参数说明:(用于返回的线程地址,线程属性,执行函数,传递的参数)
2)线程地址:也就是创建成功得到的线程对象。
线程属性:即线程的优先级、等级等,通常设置NULL就可以满足使用。
执行函数:即线程创建后要运行的函数,函数必须是指针函数且有一个传参,如void*threadStart2(void*id){}
传递的参数:传递给执行函数的参数。
3.让线程休眠,usleep(1);//休眠1毫秒。注:在linux中sleep函数是休眠进程,usleep才是休眠当前线程。同时需要#include <unistd.h>//usleep需要引入
4.线程同步(线程锁),当多个线程使用同一个数据或对象时使用。
1)创建线程锁pthread_mutex_t mutex1;
2)初始化线程锁pthread_mutex_init(&mutex1,NULL);但实验发现,即使不初始化也能正常使用mutex1线程锁。
3)在开始使用数据前获取先线程锁thread_mutex_lock(&mutex1);,如果获取不到锁,线程会在此等待直到获取到锁。
4)操作数据后,释放锁pthread_mutex_unlock(&mutex1);如果不释放锁,将会使其他线程不能获取到锁
5)当锁不再需要时,可销毁锁pthread_mutex_destroy(&mutex1);提前或错误的销毁锁,会导致其他线程不能获取到锁。但实验发现,即使不销毁锁,貌似也可以正常运行程序。

二、学习时编写的代码

部分代码:


pthread_mutex_t mutex1;//创建线程锁
void *threadStart2(void *id) {
    pthread_mutex_lock(&mutex1);//获取锁
    for (int i = 0; i < 300; i++) {
        int temp = total;
        usleep(1);//休眠1毫秒
        temp++;
        total=temp;
    }
    pthread_mutex_unlock(&mutex1);//释放锁
    LOGI("--线程持运行结束--结果:%d", total);
    //线程结束
    pthread_exit(NULL);
}
void Java_com_xcc_app4_MyJniThread2_startThread2(JNIEnv * env, jclass
jc){
total = 0;
pthread_t threads;
int id=1;
/**
 * 初始化线程锁mutex1,
 * 但实验发现,即使不初始化也能正常使用mutex1
 */
pthread_mutex_init(&mutex1,NULL);
for(int i = 0;i < 3;i++){
int rc = pthread_create(&threads, NULL, threadStart2, (void *)i);
if(rc){
LOGI("--创建线程%d失败--", i);
}else{
LOGI("--创建线程%d成功--", i);
}}
/**
 * 释放锁,
 * 实验发现,即使不释放也能正常使用。
 * 此处不能销毁锁,否则线程将无法获得到锁
 */
//pthread_mutex_destroy(&mutex1);
}



学习时编写的完整代码,下载地址:
码云:http://git.oschina.net/rookieci/NDKStudy
github:https://github.com/cookieci/NDKStudy

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章