Felixxx 的学生作业:
#include
#include
#include
#include
#include
#include
static int number = 0; //产品池
static bool done = false;
static int active_producers = 0;
static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; //互斥锁初始化
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; //条件变量初始化
//生产者
void *producer_handler(void *arg)
{
int cnt = atoi((char *)arg);
for(int i = 0;i < cnt;i++)
{
pthread_mutex_lock(&mtx);
number++;
printf("线程{%ld}生产一个产品,总产品数量为%d个\n",(long)pthread_self(),number);
pthread_cond_broadcast(&cond); //提醒所有消费者
pthread_mutex_unlock(&mtx);
usleep(1000);
}
pthread_mutex_lock(&mtx);
active_producers--;
if(active_producers == 0)
{
done = true;
pthread_cond_broadcast(&cond);
}
pthread_mutex_unlock(&mtx);
}
//消费者
void *consumer_handler(void *arg)
{
while(1)
{
pthread_mutex_lock(&mtx);
while(number == 0 && done == false)
{
pthread_cond_wait(&cond,&mtx); //wait后自动获得互斥锁
}
if(number > 0)
{
number--;
printf("线程{%ld}消费一个产品,产品数量为%d个\n",(long)pthread_self(),number);
pthread_mutex_unlock(&mtx);
usleep(1000);
}
else if(done == true)
{
pthread_mutex_unlock(&mtx);
break;
}
}
}
int main(int argc,char *argv[])
{
if(argc < 3)
return EXIT_FAILURE;
int consumer_count = 3;
for(int i = 1;i < argc;i++)
{
if(strcmp(argv[i],"-c") == 0 && i+1 < argc)
{
consumer_count = atoi(argv[i+1]);
break;
}
}
//生产者
active_producers = argc -1 - (consumer_count > 0 ? 2:0);
pthread_t producers[active_producers];
for(int i = 1,idx = 0 ; i < argc && idx < active_producers;i++)
{
if(strcmp(argv[i],"-c") == 0)
{
i++;
continue;
}
pthread_create(&producers[idx++],NULL,producer_handler,argv[i]);
}
//消费者
pthread_t consumers[consumer_count];
for(int i = 0 ; i < consumer_count ; i++)
pthread_create(&consumers[consumer_count],NULL,consumer_handler,NULL);
//等待线程结束
for(int i = 0 ; i < active_producers ; i++)
pthread_join(producers[i],NULL);
for(int i = 0 ; i < consumer_count ; i++)
pthread_join(consumers[i],NULL);
printf("任务完成,剩余%d个产品\n",number);
return 0;
}