Android C++ 多線程

版權(quán)聲明:本文為衛(wèi)偉學(xué)習(xí)總結(jié)文章,轉(zhuǎn)載請(qǐng)注明出處!
Android是基于Linux內(nèi)核的,而Linux是遵循POSIX線程標(biāo)準(zhǔn)的,POSIX線程庫(kù)中有一系列Pthreads API方便我們對(duì)Linux線程的操作。所以在Android中使用C/C++線程也就轉(zhuǎn)到了使用POSIX線程庫(kù)。他們都在頭文件"pthread.h"中。
一、創(chuàng)建子線程
1.pthread_t:用來聲明一個(gè)線程對(duì)象如:pthread_t thread;
2.pthread_create:用來創(chuàng)建一個(gè)實(shí)際的線程如:pthread_create(&pthread,NULL,threadCallBack,NULL);其總共接收4個(gè)參數(shù),第一個(gè)參數(shù)為pthread_t對(duì)象,第二個(gè)參數(shù)為線程的一些屬性,一般傳NULL。第三個(gè)參數(shù)為線程執(zhí)行的函數(shù)(void * threadCallBack(void *data),第四個(gè)參數(shù)為傳遞給線程的參數(shù)是void *類型的,即可以傳任意類型。
3.pthread_exit:用于退出線程如:pthread_exit(&thread),參數(shù)也可以傳NULL。注:線程回調(diào)函數(shù)最后必須調(diào)用此方法,不然APP會(huì)退出(掛掉)。

pthread_t  thread;

void *normalCallBack(void * data) {
    LOGI("create normal thread from c++!");
    pthread_exit(&thread);
}

extern  "C"
JNIEXPORT void JNICALL
Java_com_day1_jado_mymusic_ThreadDemo_normalThread(JNIEnv *env, jobject instance) {
    // TODO
    pthread_create(&thread, NULL, normalCallBack,NULL);
}

二、生成者和消費(fèi)者模型
1.pthread_mutex_t:用于創(chuàng)建線程鎖對(duì)象如:pthread_mutex_t mutex;
2.pthread_mutex_init:用于初始化pthread_mutex_t鎖對(duì)象如:pthread_mutex_init(&mutex,NULL);
3.pthread_mutex_destroy:用于銷毀pthread_mutex_t鎖對(duì)象如:pthread_mutex_destroy(&mutex);
4.pthread_mutex_cond_t:用于創(chuàng)建線程條件對(duì)象如:pthread_cond_t cond;
5.pthread_cond_init:用于初始化pthread_cond_t條件對(duì)象如:pthread_cond_init(&cond,NULL);
6.pthread_cond_destroy:用于銷毀pthread_cond_t條件對(duì)象如: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:用于發(fā)出條件信號(hào)如:pthread_cond_signal(&mutex,&cond);
10.pthread_cond_wait:用于線程阻塞等待,直到pthread_cond_signalfaculty條件信號(hào)后才執(zhí)行退出線程阻塞執(zhí)行后面的操作。

#include "queue"
#include "unistd.h"

pthread_t produc;
pthread_t custom;
pthread_mutex_t mutex;
pthread_cond_t cond;

std::queue<int> queue;

void *producCallback(void *data) {
while(1) {
    pthread_mutex_lock(&mutex);
    queue.push(1);
    LOGI("生產(chǎn)者生產(chǎn)一個(gè)產(chǎn)品,通知消費(fèi)者消費(fèi), 產(chǎn)品數(shù)量為 %d", queue.size());
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&mutex);
    sleep(5);
}

pthread_exit(&produc);
}

void *customCallback(void *data) {
while(1) {
    pthread_mutex_lock(&mutex);

    if(queue.size() > 0) {
        queue.pop();
        LOGI("消費(fèi)者消費(fèi)產(chǎn)品,產(chǎn)品數(shù)量還剩余 %d ", queue.size());
    } else {
        LOGI("沒有產(chǎn)品可以消費(fèi), 等待中...");
        pthread_cond_wait(&cond, &mutex);
    }
    pthread_mutex_unlock(&mutex);
    usleep(500 * 1000);
}
pthread_exit(&custom);
}

extern "C"
JNIEXPORT void JNICALL
Java_com_day1_jado_mymusic_ThreadDemo_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, producCallback, NULL);
pthread_create(&custom,NULL, customCallback, NULL);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)自:Youtherhttps://www.cnblogs.com/youtherhome/archive/201...
    njukay閱讀 1,709評(píng)論 0 52
  • 多線程系列文章源碼頭文件內(nèi)容: #include #include #include 作為程序員,就是要減少重復(fù)勞...
    batbattle閱讀 1,066評(píng)論 0 1
  • 1. Android C++多線程 1.1 Android C++ 線程簡(jiǎn)介 我們都知道Android是基于Lin...
    未見哥哥閱讀 3,528評(píng)論 0 6
  • 摘要 線程概念,線程與進(jìn)程的區(qū)別與聯(lián)系學(xué)會(huì)線程控制,線程創(chuàng)建,線程終止,線程等待了解線程分離與線程安全學(xué)會(huì)線程同步...
    狼之足跡閱讀 520評(píng)論 2 3
  • 引用自多線程編程指南應(yīng)用程序里面多個(gè)線程的存在引發(fā)了多個(gè)執(zhí)行線程安全訪問資源的潛在問題。兩個(gè)線程同時(shí)修改同一資源有...
    Mitchell閱讀 2,108評(píng)論 1 7

友情鏈接更多精彩內(nèi)容