慕尼黑0001808 的学生作业:
//实现多个生产者与多个消费者模型,在示例的基础上进行修改,提示,需要使用 pthread_cond_broadcast 函数唤醒所有阻塞的消费者线程
#include
#include
#include
#include
#include
static int number = 0;//共享变量
static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int total_of_produce = 0;//总的生产产品的数量
int total_of_consume = 0;//总的消费产品的数量
bool factory_done = false;//生产是否完成
void *thread_factory(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_cond_broadcast(&cond);
}
pthread_exit((void *)0);
}
// 消费线程
void *thread_consume(void *arg)
{
//bool done = false;
for (;;){
pthread_mutex_lock(&mtx);
// 当产品数量为 0时,让线程阻塞,并释放锁,这里一般设置循环,防止没有重新获取到锁
while(number == 0 && factory_done == false) {
printf("线程 [%ld] pthread_cond_wait 之前..\n",pthread_self());
pthread_cond_wait(&cond,&mtx);
printf("线程 [%ld] pthread_cond_wait 之后..\n", pthread_self());
}
while(number > 0){
total_of_consume++; // 消费产品总数
printf("线程 [%ld] 消费一个产品,产品剩下库存数量为:%d\n",pthread_self(),--number);
//done = total_of_consume >= total_of_produce; // 判断消费者数量与产品数量
}
pthread_mutex_unlock(&mtx); // 消费者消费完成之后,释放锁
if (factory_done)
break;
}
pthread_exit((void *)0);
}
int main(int argc,char *argv[])
{
if(argc < 2){
printf("请传入生产列表例:%s 1 2 3\n",argv[0]);
}
pthread_t tid_factory[argc-1];
pthread_t tid_consume[argc-1];
int i;
int err;
for (i = 1;i < argc;i++){
total_of_produce += atoi(argv[i]); // 生产数量的总和
err = pthread_create(&tid_factory[i-1],NULL,thread_factory,(void *)argv[i]);
if (err != 0){
perror("[ERROR] pthread_create(): ");
exit(EXIT_FAILURE);
}
err = pthread_create(&tid_consume[i-1],NULL,thread_consume,(void *)argv[i]);
if (err != 0){
perror("[ERROR] pthread_create(): ");
exit(EXIT_FAILURE);
}
}
for(i = 1;i < argc;i++){
pthread_join(tid_factory[i-1],NULL);
}
factory_done = true;
pthread_cond_broadcast(&cond);
for(i = 1;i < argc;i++){
pthread_join(tid_consume[i-1],NULL);
}
printf("一共生产了%d个产品,一共消费了%d个产品\n",total_of_produce,total_of_consume);
return 0;
}
运行结果:
linux@linux-VMware-Virtual-Platform:~/study/homework/10106$ gcc main.c
linux@linux-VMware-Virtual-Platform:~/study/homework/10106$ ./a.out 1 2 3
线程 [128696595773120] 生产一个产品,产品数量为:1
线程 [128696587380416] 消费一个产品,产品剩下库存数量为:0
线程 [128696587380416] pthread_cond_wait 之前..
线程 [128696578987712] 生产一个产品,产品数量为:1
线程 [128696578987712] 生产一个产品,产品数量为:2
线程 [128696587380416] pthread_cond_wait 之后..
线程 [128696587380416] 消费一个产品,产品剩下库存数量为:1
线程 [128696587380416] 消费一个产品,产品剩下库存数量为:0
线程 [128696587380416] pthread_cond_wait 之前..
线程 [128696570595008] pthread_cond_wait 之前..
线程 [128696562202304] 生产一个产品,产品数量为:1
线程 [128696562202304] 生产一个产品,产品数量为:2
线程 [128696562202304] 生产一个产品,产品数量为:3
线程 [128696480429760] 消费一个产品,产品剩下库存数量为:2
线程 [128696480429760] 消费一个产品,产品剩下库存数量为:1
线程 [128696480429760] 消费一个产品,产品剩下库存数量为:0
线程 [128696587380416] pthread_cond_wait 之后..
线程 [128696570595008] pthread_cond_wait 之后..
一共生产了6个产品,一共消费了6个产品
linux@linux-VMware-Virtual-Platform:~/study/homework/10106$