我的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

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