1. NDK你必須學習的技術,pthread線程建立java
2. NDK你必須學習的技術,pthread線程同步互斥鎖的使用函數
3. NDK你必須學習的技術,pthread線程簡單的生產者消費者模式post
咱們學習過pthread的線程建立後,再來學習線程同步互斥鎖的使用,互斥鎖相似於java線程的同步synchronized或者lock、unlock。學習
// pthread_create_demo02.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h> // 引入pthread頭文件
// 互斥鎖變量
pthread_mutex_t mutex;
int i = 0;
// 線程回調執行函數
void* thread_callback(void* arg){
// 加鎖
pthread_mutex_lock(&mutex);
char* ch = (char*)arg;
for(; i < 5; i++){
printf("%s thread, i:%d\n", ch, i);
// 爲了打印的時候能看出執行效果,在此對當前執行的線程休眠1秒後再執行程序
sleep(1);
}
i = 0;
// 解鎖
pthread_mutex_unlock(&mutex);
}
void main(){
// 建立兩個線程,用於爭奪使用共享功能資格,來達到互斥鎖目的
pthread_t tid1, tid2;
// 初始化互斥鎖變量
pthread_mutex_init(&mutex, NULL);
// 建立兩個線程
pthread_create(&tid1, NULL, thread_callback, "Jerry01");
pthread_create(&tid2, NULL, thread_callback, "Jerry02");
// 等待兩個線程執行完成
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
// 結束銷燬互斥鎖
pthread_mutex_destroy(&mutex);
}
複製代碼
互斥鎖的使用流程:ui
看看沒有加互斥鎖和加了互斥鎖的執行結果: spa
很明顯,沒有加互斥鎖的程序,線程執行是沒有順序的,徹底看線程本身搶佔cpu執行資源,並且共享變量i的數據已經錯亂。 加了互斥鎖後,線程之間執行是有序的,當一個線程正在執行互斥鎖代碼判斷的時候,另一個線程沒法訪問,而且共享的數據是相互獨立的,不用擔憂正在使用共享數據的時候,被其它的線程修改了值。