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);
}
执行结果:
![](https://img.haomeiwen.com/i2971226/0f4e2e754cc7502d.png)
生产者生产一个产品,然后signal通知给消费者,消费者就消费一个产品。
这是一个简单的生产者消费者模型,实际项目中,多半会使用线程池,或者有多个生产者、消费者线程,同时生产的产品、任务会用一个队列来存储管理,上述例子博主只是用了一个模拟的task++、task--来做任务的添加和删除的操作。
1. NDK你必须学习的技术,pthread线程创建
2. NDK你必须学习的技术,pthread线程同步互斥锁的使用
3. NDK你必须学习的技术,pthread线程简单的生产者消费者模式