为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 100
学习任务

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; }

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号