1. NDK你必須學(xué)習(xí)的技術(shù),pthread線程創(chuàng)建
2. NDK你必須學(xué)習(xí)的技術(shù),pthread線程同步互斥鎖的使用
3. NDK你必須學(xué)習(xí)的技術(shù),pthread線程簡(jiǎn)單的生產(chǎn)者消費(fèi)者模式
前面兩篇文章,我們已經(jīng)學(xué)習(xí)了線程的創(chuàng)建和同步互斥鎖的使用,在項(xiàng)目實(shí)戰(zhàn)中往往多線程還伴隨著一個(gè)經(jīng)典的模式:生產(chǎn)者消費(fèi)者模式。
生產(chǎn)者不斷的生產(chǎn)執(zhí)行的任務(wù)、產(chǎn)品,消費(fèi)者不斷的消費(fèi)生產(chǎn)出來的任務(wù)、產(chǎn)品。
下面我們講實(shí)現(xiàn)一個(gè)簡(jiǎn)單的,生產(chǎn)者消費(fèi)者多線程程序模型。
這篇文章我們引入一個(gè)新的概念,條件變量。用于等待生產(chǎn)者生產(chǎn)產(chǎn)品和通知消費(fèi)者來消費(fèi)產(chǎn)品。
// 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;
// 模擬生產(chǎn)出的產(chǎn)品、任務(wù)隊(duì)列
int task;
// 生產(chǎn)者線程執(zhí)行函數(shù)
void* thread_producer(void* arg){
// 模擬不斷的生產(chǎn)產(chǎn)品,產(chǎn)生任務(wù)
for(;;){
// 加鎖,加鎖是為了在有多個(gè)生產(chǎn)者線程的時(shí)候保持互斥關(guān)系(當(dāng)然我這只有一個(gè)生產(chǎn)者線程)
pthread_mutex_lock(&mutex);
// 模擬添加生產(chǎn)一個(gè)產(chǎn)品、任務(wù)到隊(duì)列中
task++;
printf("producter produce product\n");
// 通過條件變量,通知消費(fèi)者線程有產(chǎn)品、任務(wù)可以消費(fèi)
pthread_cond_signal(&condition);
// 通知打印
printf("producter singal\n");
// 解鎖
pthread_mutex_unlock(&mutex);
// 控制下生產(chǎn)產(chǎn)品的速度
sleep(1);
}
}
// 消費(fèi)者線程執(zhí)行函數(shù)
void* thread_consumer(void* arg){
for(;;){
// 加鎖,加鎖是為了在有多個(gè)消費(fèi)者線程的時(shí)候保持互斥關(guān)系(當(dāng)然我這只有一個(gè)消費(fèi)者線程)
pthread_mutex_lock(&mutex);
while(task == 0){
// 模擬,沒有產(chǎn)品、任務(wù)的時(shí)候,等待生產(chǎn)者生產(chǎn)產(chǎn)品、任務(wù)
pthread_cond_wait(&condition, &mutex);
}
// 模擬有產(chǎn)品,消費(fèi)產(chǎn)品、任務(wù)
task--;
printf("custom product\n");
sleep(1);
// 解鎖
pthread_mutex_unlock(&mutex);
}
}
void main(){
// 初始化互斥鎖、條件變量
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&condition, NULL);
// 創(chuàng)建一個(gè)生產(chǎn)者、一個(gè)消費(fèi)者線程
pthread_t tid_producer, tid_consumer;
pthread_create(&tid_producer, NULL, thread_producer, NULL);
pthread_create(&tid_consumer, NULL, thread_consumer, NULL);
// 等待生產(chǎn)者和消費(fèi)者線程執(zhí)行完成
pthread_join(tid_producer, NULL);
pthread_join(tid_consumer, NULL);
// 銷毀回收互斥鎖、條件變量
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&condition);
}
執(zhí)行結(jié)果:

生產(chǎn)者生產(chǎn)一個(gè)產(chǎn)品,然后signal通知給消費(fèi)者,消費(fèi)者就消費(fèi)一個(gè)產(chǎn)品。
這是一個(gè)簡(jiǎn)單的生產(chǎn)者消費(fèi)者模型,實(shí)際項(xiàng)目中,多半會(huì)使用線程池,或者有多個(gè)生產(chǎn)者、消費(fèi)者線程,同時(shí)生產(chǎn)的產(chǎn)品、任務(wù)會(huì)用一個(gè)隊(duì)列來存儲(chǔ)管理,上述例子博主只是用了一個(gè)模擬的task++、task--來做任務(wù)的添加和刪除的操作。
1. NDK你必須學(xué)習(xí)的技術(shù),pthread線程創(chuàng)建
2. NDK你必須學(xué)習(xí)的技術(shù),pthread線程同步互斥鎖的使用
3. NDK你必須學(xué)習(xí)的技術(shù),pthread線程簡(jiǎn)單的生產(chǎn)者消費(fèi)者模式