NDK你必須學習的技術,pthread線程同步互斥鎖的使用

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

  1. 初始化互斥鎖變量,經過pthread_mutex_init函數
  2. 在線程執行的代碼塊中,使用pthread_mutex_lock函數進行加鎖,加鎖後的線程執行代碼塊同時就只能一個線程訪問執行,也就是上述例子thread_callback函數裏的遍歷打印的功能。
  3. 互斥代碼塊執行完後,使用pthread_mutex_unlock進行解鎖。
  4. 最後記得在主線程把互斥鎖遍歷給釋放銷燬,經過pthread_mutex_destroy函數。

看看沒有加互斥鎖和加了互斥鎖的執行結果: spa

沒有加互斥鎖結果
加了互斥鎖結果
很明顯,沒有加互斥鎖的程序,線程執行是沒有順序的,徹底看線程本身搶佔cpu執行資源,並且共享變量i的數據已經錯亂。 加了互斥鎖後,線程之間執行是有序的,當一個線程正在執行互斥鎖代碼判斷的時候,另一個線程沒法訪問,而且共享的數據是相互獨立的,不用擔憂正在使用共享數據的時候,被其它的線程修改了值。


1. NDK你必須學習的技術,pthread線程建立線程

2. NDK你必須學習的技術,pthread線程同步互斥鎖的使用code

3. NDK你必須學習的技術,pthread線程簡單的生產者消費者模式cdn

相關文章
相關標籤/搜索