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

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

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);
}

複製代碼

執行結果: 線程

image.png

生產者生產一個產品,而後signal通知給消費者,消費者就消費一個產品。code

這是一個簡單的生產者消費者模型,實際項目中,多半會使用線程池,或者有多個生產者、消費者線程,同時生產的產品、任務會用一個隊列來存儲管理,上述例子博主只是用了一個模擬的task++、task--來作任務的添加和刪除的操做。cdn


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

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

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

相關文章
相關標籤/搜索