NDK之原生线程的使用

NDK日志宏的简单写法
#include <android/log.h>

#define TAG  "native_log"
#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR, TAG ,__VA_ARGS__)
JNI_OnLoad的使用
JNIEXPORT jint JNI_OnLoad(JavaVM* jvm,void *reserved){
    if(NULL==gvm){
        gvm = jvm;
    }
    //注意此处的返回值
    return JNI_VERSION_1_4;
}
原生线程创建与合并

注意AS中native方法的返回值

原生线程的创建
 pthread_t t;
 int result = pthread_create(&t,NULL,doNativeThreadRun2,args);
//子线程需要执行的方法

static void* doNativeThreadRun2(void* args){
    LOGE("resul4 %d",((WorkArgs*)args)->workId);
    //子线程添加到jvm中
    JNIEnv* env;
    jint code = gvm->AttachCurrentThread(&env,NULL);
    //解析线程参数
    WorkArgs* workArgs = (WorkArgs*)args;
    Java_com_canjun_ndkbeginer_MainActivity_nativeWorker(env,gObject,workArgs->workId,workArgs->iterationCount);
    delete workArgs;
    gvm->DetachCurrentThread();

    int* result = (int*)malloc(sizeof(int));
    *result = 1;
    return result;
}
原生线程的合并
void * result = NULL;
if(0!=pthread_join(t,&result)){
    throwEx(env,"unable to join thread");
    return;
} else{
    ...
    处理返回结果 result
}
原生线程同步

由于运行在相同的进程空间,线程共享内存和资源。这使得线程之间通讯和共享数据变得容易,但是有可能产生两种错误:由于并发修改共享资源产生线程干扰和内存不一致性,此时线程同步变得至关重要。线程同步机制确保这个并发的线程不同时执行代码的特定部分。

  • 互斥锁同步
  • 信号量同步
互斥锁同步
//创建同步锁
static pthread_mutex_t mutex;
if(0!=pthread_mutex_init(&mutex,NULL)){
    throwEx(env,"unable to init mutex");
    goto exit;
}

//加锁
if(0!=pthread_mutex_lock(&mutex)){
    throwEx(env,"unable lock mutex");
    goto exit;
}
//去锁
if(0!=pthread_mutex_unlock(&mutex)){
    throwEx(env,"unable to unlock mutex");
    goto exit;
}
//释放锁
if(0!=pthread_mutex_destroy(&mutex)){
    throwEx(env,"unable to destroy  mutex");
}
信号量同步
引入头文件 
#include <semaphore.h>

//初始化信号量
if(0!=sem_init(&sem,2,2)){
    throwEx(env,"unable to init sem");
    goto exit;
}

//加信号量
if(0!=sem_wait(&sem)){
    throwEx(env,"unable to init sem");
    goto exit;
}
//去信号量
if(0!=sem_post(&sem)){
    throwEx(env,"unable to init sem");
    goto exit;
}

//释放信号量对象
if(0!=sem_destroy(&sem)){
    throwEx(env,"unable to init sem");
    goto exit;
}
原生线程优先级和调度策略
  • 优先级
  • 调度策略
调度策略
#include <sched.h>
1. 先进先出策略(SCHED_FIFO)
2. 循环轮训策略 (SCHED_RR)

使用方式一
//创建原生子线程时,在pthread_attr_t的thread_policy中指定
使用方式二
//在子线程调用时指定
pthread_setschedparams(ptread_t t,int policy s,struct schedparam const* params);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值