C多线程:一生产者与多消费者
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#define CUSTOMER_NUM 3
static pthread_mutex_t mutex;
static pthread_mutexattr_t attr;
static pthread_cond_t cond1,cond2;
static int num = 1;
static int flag = 1;
static pthread_t ps[CUSTOMER_NUM];
static void func1(void* n)
{
int i = *(int*)n;
while(num != 10)
{
pthread_mutex_lock(&mutex);
while(flag == num && flag != 10)
{
pthread_cond_wait(&cond1,&mutex);
if(flag == 10)
goto LOOP;
}
flag = num;
printf("customer%d : num = %d\n",i,num);
pthread_cond_signal(&cond2);
if(flag == 10)
pthread_cond_broadcast(&cond1);
pthread_mutex_unlock(&mutex);
}
printf("exit %d\n",i);
pthread_exit(NULL);
LOOP:
printf("exit %d\n",i);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
static void func2()
{
while(num != 10)
{
pthread_mutex_lock(&mutex);
while(flag != num)
{
pthread_cond_wait(&cond2,&mutex);
}
printf("---begin add!---\n");
num++;
pthread_cond_signal(&cond1);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main()
{
int ret,i;
int a[3] = {1,2,3};
pthread_mutexattr_init(&attr);
pthread_cond_init(&cond1,NULL);
pthread_cond_init(&cond2,NULL);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&mutex,&attr);
pthread_t product;
ret = pthread_create(&product,NULL,(void*)func2,NULL);
if(ret != 0)
exit(-1);
for(i=0; i<CUSTOMER_NUM; i++)
{
ret = pthread_create(&ps[i],NULL,(void*)func1,&a[i]);
if(ret != 0)
exit(-1);
}
for(i=0; i<CUSTOMER_NUM; i++)
pthread_join(ps[i],NULL);
pthread_join(product,NULL);
printf("----------\n");
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond1);
pthread_cond_destroy(&cond2);
return 0;
}
运行结果示例:
---begin add!---
customer1 : num = 2
---begin add!---
customer3 : num = 3
---begin add!---
customer1 : num = 4
---begin add!---
customer1 : num = 5
---begin add!---
customer1 : num = 6
---begin add!---
customer2 : num = 7
---begin add!---
customer3 : num = 8
---begin add!---
customer1 : num = 9
---begin add!---
customer2 : num = 10
exit 2
exit 1
exit 3
----------