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

作业社区

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

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

犹豫就会败北~ 的学生作业:

#include #include #include #include #include // 实现多个生产者与多个消费者模型,在示例的基础上进行修改,提示,需要使用 pthread_cond_broadcast // 函数唤醒所有阻塞的消费者线程 static int number = 0; // 共享变量 static int total_of_consume = 0; // 总的消费产品的数量 static int total_of_produce = 0; // 总的生产产品的数量 bool done = false; static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; void* thread_handler_produce(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_cond_broadcast(&cond); pthread_mutex_unlock(&mtx); } pthread_exit((void*)0); } void* thread_handler_custom(void* arg) { for (;;) { pthread_mutex_lock(&mtx); while (number ==0 && !done) pthread_cond_wait(&cond, &mtx); if (done){ pthread_mutex_unlock(&mtx); break; } if (number>0) { number--; total_of_consume++; // 总的消费产品数量+1 printf("thread [%ld] 消费一个产品,产品数量为:%d\n",pthread_self(), number); } // 判断是否可以结束 if (total_of_consume>=total_of_produce) { done=true; pthread_cond_broadcast(&cond); // 唤醒其他消费线程,让它们可以退出 } pthread_mutex_unlock(&mtx); // 消费者消费完成之后,释放锁 } pthread_exit((void*)0); } int main(int argc, char* argv[]) { pthread_t producers[argc-1]; pthread_t consumers[2]; int i; int err; for (i = 1; i < argc; i++) { total_of_produce += atoi(argv[i]); // 生产数量的总和 err = pthread_create(&producers[i-1], NULL, thread_handler_produce, (void*)argv[i]); if (err != 0) { perror("[ERROR] pthread_create(): "); exit(EXIT_FAILURE); } printf("生产线程 [%ld] 开始生产产品。\n", producers[i]); } // 2个消费线程 for (int j = 0; j < 2; j++) { err = pthread_create(&consumers[j],NULL,thread_handler_custom,NULL); if (err !=0) { perror("[ERROR] pthread_create(): "); exit(EXIT_FAILURE); } printf("消费线程 [%ld] 开始消费产品。\n", consumers[j]); } for (int i = 0; i < argc-1; i++) { pthread_join(producers[i],NULL); } pthread_join(consumers[0],NULL); pthread_join(consumers[1],NULL); return 0; }

得分 100
学习任务

犹豫就会败北~ 的学生作业:

#include #include #include #include #include #include /** * 基于互斥锁实现生产者与消费者模型 主线程为消费者 n 个子线程作为生产者 */ static int totalNum = 0; // 仓库中产品的数量 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* product_phread(void* arg) { int count = atoi((char*)arg); // 将argv[2]等字符串,转为数字 int temp; for (int i = 0; i < count; i++) { pthread_mutex_lock(&mutex); temp = totalNum; temp = temp + 1; totalNum = temp; printf("pthread[%ld] product 1 production, totalNum: %d\n", pthread_self(), totalNum); pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } // ./a.out 1 2 4 6 代表有4个线程,每个线程生产的产品数量为 1,2,4,6 int main(int argc, char* argv[]) { if (argc < 2) { printf("[ERROR] arguments error.\n"); exit(EXIT_FAILURE); } // 存储线程id的数组 bool done = false; int costNum = 0; // 总的消费产品数量 int productNum = 0; // 总的生产产品数量 pthread_t* tid = malloc(sizeof(pthread_t) * (argc - 1)); if (tid == NULL) { perror("malloc failed.\n"); exit(EXIT_FAILURE); } for (int i = 0; i < argc - 1; i++) { tid[i] = 0; } // 创建线程 for (int i = 0; i < argc - 1; i++) { int err; productNum += atoi(argv[i + 1]); // 生产产品的总和 err = pthread_create(&tid[i], NULL, product_phread, (void*)argv[i + 1]); if (err != 0) { fprintf(stderr, "[ERROR] pthread_create() failed: %s\n", strerror(err)); exit(EXIT_FAILURE); } printf("thread < %ld> start.\n", tid[i]); } // 消费者消费产品 while (1) { pthread_mutex_lock(&mutex); while (totalNum > 0) { costNum++; printf("customer thread 1 production, producer’s surplus production totalNUM: %d\n", --totalNum); } pthread_mutex_unlock(&mutex); sleep(1); done = costNum >= productNum; if (done) { break; } } // 等待子线程结束 for (int i = 0; i < argc - 1; i++) { pthread_join(tid[i], NULL); } free(tid); return 0; }

得分 100
学习任务

zhuluoc 的学生作业:

#include int main() { int a[2][3] = {10, 20, 30, 40, 50, 60}; int (*p)[3] = a; int i = 0, j = 0; // 要求通过多种方式输出a数组中的数据; // 方式一:a[i][j] printf("a[i][j]: \n"); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { printf("%d ", a[i][j]); } printf("\n"); } printf("\n"); // 方式二:* (a[i] + j); printf("*(a[i] + j): \n"); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { printf("%d ", *(a[i] + j)); } printf("\n"); } printf("\n"); // 方式三:* (*(a + i) + j); printf("*(*(a + i) + j): \n"); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { printf("%d ", *(*(a + i) + j)); } printf("\n"); } printf("\n"); // 方式四: *(p[i][j]) printf("p[i][j]: \n"); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { printf("%d ", p[i][j]); } printf("\n"); } printf("\n"); // 方式五:*(p[i] + j) printf("*(p[i] + j): \n"); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { printf("%d ", *(p[i] + j)); } printf("\n"); } printf("\n"); // 方式六:*(*(p + i) + j) printf("*(*(p + i) + j): \n"); for (i = 0; i < 2; i++) { fo (j = 0; j < 3; j++) { printf("%d ", *(*(p + i) + j)); } printf("\n"); } printf("\n"); return 0; } 输出结果: a[i][j]: 10 20 30 40 50 60 *(a[i] + j): 10 20 30 40 50 60 ((a + i) + j): 10 20 30 40 50 60 p[i][j]: 10 20 30 40 50 60 *(p[i] + j): 10 20 30 40 50 60 ((p + i) + j): 10 20 30 40 50 60

微信客服

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

帮助反馈 APP下载

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

公众号

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