NDK你必须学习的技术,pthread线程简单的生产者消费者模式

2017-09-01  本文已影响243人  JerryloveEmily

1. NDK你必须学习的技术,pthread线程创建
2. NDK你必须学习的技术,pthread线程同步互斥锁的使用
3. NDK你必须学习的技术,pthread线程简单的生产者消费者模式


前面两篇文章,我们已经学习了线程的创建和同步互斥锁的使用,在项目实战中往往多线程还伴随着一个经典的模式:生产者消费者模式。
生产者不断的生产执行的任务、产品,消费者不断的消费生产出来的任务、产品。

下面我们讲实现一个简单的,生产者消费者多线程程序模型。

这篇文章我们引入一个新的概念,条件变量。用于等待生产者生产产品和通知消费者来消费产品。

// 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通知给消费者,消费者就消费一个产品。

这是一个简单的生产者消费者模型,实际项目中,多半会使用线程池,或者有多个生产者、消费者线程,同时生产的产品、任务会用一个队列来存储管理,上述例子博主只是用了一个模拟的task++、task--来做任务的添加和删除的操作。


1. NDK你必须学习的技术,pthread线程创建
2. NDK你必须学习的技术,pthread线程同步互斥锁的使用
3. NDK你必须学习的技术,pthread线程简单的生产者消费者模式

上一篇 下一篇

猜你喜欢

热点阅读