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线程简单的生产者消费者模式

相关文章
相关标签/搜索