示例
基于条件变量实现生产者与消费者模型(多个生产者对应一个消费者)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <pthread.h>
#include <unistd.h>
static int number = 0;//共享变量
static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void *thread_handler(void *arg)
{
int cnt = atoi((char *)arg);
int i,tmp;
for(i = 0;i < cnt;i++){
pthread_mutex_lock(&mtx);
printf("线程 [%ld] 生产一个产品,产品数量为:%d\n",pthread_self(),++number);
pthread_mutex_unlock(&mtx);
pthread_cond_signal(&cond); // 唤醒消费者线程
}
pthread_exit((void *)0);
}
int main(int argc,char *argv[])
{
pthread_t tid;
int i;
int err;
int total_of_produce = 0;//总的生产产品的数量
int total_of_consume = 0;//总的消费产品的数量
bool done = false;
for (i = 1;i < argc;i++){
total_of_produce += atoi(argv[i]); // 生产数量的总和
err = pthread_create(&tid,NULL,thread_handler,(void *)argv[i]);
if (err != 0){
perror("[ERROR] pthread_create(): ");
exit(EXIT_FAILURE);
}
}
for (;;){
pthread_mutex_lock(&mtx);
while(number == 0) // 当产品数量为 0时,让线程阻塞,并释放锁,这里一般设置循环,防止没有重新获取到锁
pthread_cond_wait(&cond,&mtx);
while(number > 0){
total_of_consume++; // 消费产品总数
printf("消费一个产品,产品数量为:%d\n",--number);
done = total_of_consume >= total_of_produce; // 判断消费者数量与产品数量
}
pthread_mutex_unlock(&mtx); // 消费者消费完成之后,释放锁
if (done)
break;
}
运行结果
程 [139950703310592] 生产一个产品,产品数量为:1
消费一个产品,产品数量为:0
线程 [139950703310592] 生产一个产品,产品数量为:1
消费一个产品,产品数量为:0
线程 [139950703310592] 生产一个产品,产品数量为:1
消费一个产品,产品数量为:0
线程 [139950720096000] 生产一个产品,产品数量为:1
消费一个产品,产品数量为:0
线程 [139950711703296] 生产一个产品,产品数量为:1
线程 [139950711703296] 生产一个产品,产品数量为:2
消费一个产品,产品数量为:1
消费一个产品,产品数量为:0
练习
实现多个生产者与多个消费者模型,在示例的基础上进行修改,提示,需要使用 pthread_cond_broadcast 函数唤醒所有阻塞的消费者线程