NDK你必須學(xué)習(xí)的技術(shù),pthread線程簡(jiǎn)單的生產(chǎn)者消費(fèi)者模式

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é)果:

image.png

生產(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)者模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容