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

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

作者: JerryloveEmily | 来源:发表于2017-09-01 17:14 被阅读243次

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/lfhkjxtx.html