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);
發佈了93 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章