1. NDK你必須學習的技術,pthread線程建立java
2. NDK你必須學習的技術,pthread線程同步互斥鎖的使用linux
3. NDK你必須學習的技術,pthread線程簡單的生產者消費者模式shell
Android開發到必定階段,有些東西須要更高的性能和安全性,甚至更豐富的功能支持,天然少不了底層NDK的支持,既然是性能的優化,也少不了多線程的支持,好比視頻編解碼,推流,圖片編解碼等耗時操做,java層的多線程Thread想必都是爛熟於心了,那NDK的C/C++的多線程呢,這裏就引入了大名鼎鼎的pthread。下面對pthread相關的基本使用作一個入門和部分進階。vim
由於只是單純的介紹pthread的使用,就只是涉及C相關程序,沒有涉及Android和NDK方面的內容,可是用法是同樣的。我這裏使用的是阿里雲主機linux環境下,編輯器是vim,編譯器是gcc,沒有使用IDE集成開發環境。固然windows下也有不少的選擇,好比:Visual Studio、QT Creator、NetBeans、Eclipse等等。windows
身爲Android開發者來講,咱們都知道java的線程的建立是經過new Thread(new Runnable()).start()。那麼pthread怎麼建立一個線程:安全
// pthread_create_demo.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h> // 引入pthread頭文件
// 子線程回調執行
void* thread_callback(void* arg){
char* ch = (char*)arg;
int i = 0;
for(; i < 10; i++){
printf("%s thread, i:%d\n", ch, i);
if(i==5){
// 退出當前線程,自殺線程
pthread_exit();
// 關閉其餘的線程
// pthread_cancel();
}
}
}
void main(){
printf("%s\n", "main_pthread...");
// 線程id
pthread_t tid;
// 建立線程,線程的id爲tid
pthread_create(&tid, NULL, thread_callback, "Jerry");
// 等待線程tid執行結束
pthread_join(tid, NULL);
}
複製代碼
使用pthread建立子線程也很簡單,pthread_create函數,下面來講說它的參數,這裏咱們利用man命令來查看幫助文檔:多線程
// pthread_create的函數聲明
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
複製代碼
**第一個參數,pthread_t *thread:**表示建立的線程的id號,和java的Thread建立的線程同樣都會有個惟一識別號。 **第二個參數,const pthread_attr_t *attr:**表示線程的屬性設置。 **第三個參數,void *(*start_routine) (void *):**很明顯這是一個函數指針,表示線程建立後回調執行的函數,相似於java中線程的 run()方法,只是在C的線程更靈活些使用函數指針執行的回調函數本身設置,上面的例子用的就是本身聲明定義的函數thread_callback。 **第四個參數,void *arg:**這個參數很簡單,表示的就是函數指針回調執行函數的參數。上面例子傳入的參數是字符串"Jerry",因此thread_callback函數定義的地方接收到的參數天然就是這字符串,因此可使用char* ch = (char*)arg來強制轉換爲char*字符串類型來接收。 以上小例子執行的結果:編輯器
// 經過這個shell命令編譯連接出可執行程序
gcc pthread_create_demo.c -o pthread_create_demo -lpthread
// 再經過這個命令執行程序
./pthread_create_demo
複製代碼