2. NDK你必須學習的技術,pthread線程同步互斥鎖的使用函數
3. NDK你必須學習的技術,pthread線程簡單的生產者消費者模式post
前面兩篇文章,咱們已經學習了線程的建立和同步互斥鎖的使用,在項目實戰中每每多線程還伴隨着一個經典的模式:生產者消費者模式。 生產者不斷的生產執行的任務、產品,消費者不斷的消費生產出來的任務、產品。學習
下面咱們講實現一個簡單的,生產者消費者多線程程序模型。ui
這篇文章咱們引入一個新的概念,條件變量。用於等待生產者生產產品和通知消費者來消費產品。spa
// pthread_create_demo03.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h> // 引入pthread頭文件
// 互斥鎖變量
pthread_mutex_t mutex;
// 條件變量
pthread_cond_t condition;
// 模擬生產出的產品、任務隊列
int task;
// 生產者線程執行函數
void* thread_producer(void* arg){
// 模擬不斷的生產產品,產生任務
for(;;){
// 加鎖,加鎖是爲了在有多個生產者線程的時候保持互斥關係(固然我這隻有一個生產者線程)
pthread_mutex_lock(&mutex);
// 模擬添加生產一個產品、任務到隊列中
task++;
printf("producter produce product\n");
// 經過條件變量,通知消費者線程有產品、任務能夠消費
pthread_cond_signal(&condition);
// 通知打印
printf("producter singal\n");
// 解鎖
pthread_mutex_unlock(&mutex);
// 控制下生產產品的速度
sleep(1);
}
}
// 消費者線程執行函數
void* thread_consumer(void* arg){
for(;;){
// 加鎖,加鎖是爲了在有多個消費者線程的時候保持互斥關係(固然我這隻有一個消費者線程)
pthread_mutex_lock(&mutex);
while(task == 0){
// 模擬,沒有產品、任務的時候,等待生產者生產產品、任務
pthread_cond_wait(&condition, &mutex);
}
// 模擬有產品,消費產品、任務
task--;
printf("custom product\n");
sleep(1);
// 解鎖
pthread_mutex_unlock(&mutex);
}
}
void main(){
// 初始化互斥鎖、條件變量
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&condition, NULL);
// 建立一個生產者、一個消費者線程
pthread_t tid_producer, tid_consumer;
pthread_create(&tid_producer, NULL, thread_producer, NULL);
pthread_create(&tid_consumer, NULL, thread_consumer, NULL);
// 等待生產者和消費者線程執行完成
pthread_join(tid_producer, NULL);
pthread_join(tid_consumer, NULL);
// 銷燬回收互斥鎖、條件變量
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&condition);
}
複製代碼
執行結果: 線程
生產者生產一個產品,而後signal通知給消費者,消費者就消費一個產品。code
這是一個簡單的生產者消費者模型,實際項目中,多半會使用線程池,或者有多個生產者、消費者線程,同時生產的產品、任務會用一個隊列來存儲管理,上述例子博主只是用了一個模擬的task++、task--來作任務的添加和刪除的操做。cdn
1. NDK你必須學習的技術,pthread線程建立blog