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

作业社区

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

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

北城半夏4806197 的学生作业:

#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; // 条件变量 // 生产者线程函数 void *producer_thread(void *arg) { int cnt = atoi((char *)arg); // 获取生产的产品数量 int i; for (i = 0; i < cnt; i++) { pthread_mutex_lock(&mtx); // 加锁 printf("生产者 [%ld] 生产一个产品, 当前产品数量: %d\n", pthread_self(), ++number); pthread_mutex_unlock(&mtx); // 解锁 pthread_cond_broadcast(&cond); // 唤醒所有等待的消费者线程 sleep(1); // 模拟生产时间 } pthread_exit((void *)0); } // 消费者线程函数 void *consumer_thread(void *arg) { int consumed = 0; // 消费的产品数量 int total_to_consume = atoi((char *)arg); // 需要消费的总产品数量 while (consumed < total_to_consume) { pthread_mutex_lock(&mtx); // 加锁 while (number == 0) // 如果没有产品可消费,等待 { printf("消费者 [%ld] 等待产品...\n", pthread_self()); pthread_cond_wait(&cond, &mtx); } printf("消费者 [%ld] 消费一个产品, 当前产品数量: %d\n", pthread_self(), --number); consumed++; pthread_mutex_unlock(&mtx); // 解锁 sleep(1); // 模拟消费时间 } pthread_exit((void *)0); } int main(int argc, char *argv[]) { pthread_t producer_tid, consumer_tid; int i; int total_to_produce = 0; // 总生产数量 int total_to_consume = 0; // 总消费数量 if (argc < 3) { printf("Usage: %s \n", argv[0]); return EXIT_FAILURE; } int producer_count = atoi(argv[1]); // 生产者线程数量 int consumer_count = atoi(argv[2]); // 消费者线程数量 // 创建生产者线程 for (i = 0; i < producer_count; i++) { int produce_count = atoi(argv[3 + i]); // 每个生产者生产的数量 total_to_produce += produce_count; if (pthread_create(&producer_tid, NULL, producer_thread, (void *)argv[3 + i]) != 0) { perror("[ERROR] pthread_create() for producer"); exit(EXIT_FAILURE); } } // 创建消费者线程 for (i = 0; i < consumer_count; i++) { total_to_consume += total_to_produce / consumer_count; // 假设每个消费者消费相同数量的产品 if (pthread_create(&consumer_tid, NULL, consumer_thread, (void *)argv[3 + producer_count + i]) != 0) { perror("[ERROR] pthread_create() for consumer"); exit(EXIT_FAILURE); } } // 等待所有生产者线程结束 for (i = 0; i < producer_count; i++) { pthread_join(producer_tid, NULL); } // 等待所有消费者线程结束 for (i = 0; i < consumer_count; i++) { pthread_join(consumer_tid, NULL); } printf("所有生产者和消费者线程已完成。\n"); return EXIT_SUCCESS; }

微信客服

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

帮助反馈 APP下载

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

公众号

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