
作业社区
探索学习新天地,共享知识资源!
向佐佐 的学生作业:
#include #include #include #include #include #include static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; static int number = 0; // 记录仓库里的产品的数量 static bool done = false; // 标志位,表示生产是否完成 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 生产者线程的执行函数 void* thread_handler(void* arg) { int cnt = atoi((char*)arg); for (int i = 0; i < cnt; i++) { pthread_mutex_lock(&mutex); printf("线程[%ld]生产一个产品,产品数量为:%d\n", pthread_self(), ++number); pthread_mutex_unlock(&mutex); pthread_cond_broadcast(&cond); // 唤醒所有在cond阻塞的消费者线程 } pthread_exit(NULL); return NULL; } // 消费者线程执行函数 void* thread_handler_consume(void* arg) { while (true) { pthread_mutex_lock(&mutex); while (number == 0 && !done) { // 仓库中没有产品且生产未完成,则等待 pthread_cond_wait(&cond, &mutex); } if (done && number == 0) { // 生产完成且仓库为空,退出 pthread_mutex_unlock(&mutex); break; } // 消费产品 //total_of_consume++; printf("线程[%ld]消费一个产品,产品数量:%d\n", pthread_self(), --number); sleep(1); // 模拟消费时间 pthread_mutex_unlock(&mutex); } pthread_exit(NULL); return NULL; } // main函数输入argc个参数 // argv[1]~argv[argc-2]代表创建argc-2个生产者线程,每个线程分别生产1,2,3,...,argc-2个产品 // argv[argc-1]代表创建argv[argc-1]个消费者线程 int main(int argc, char* argv[]) { pthread_t tid_p[argc - 2]; pthread_t tid_c[atoi(argv[argc - 1])]; int i, err; // 创建生产者线程 for (i = 1; i < argc - 1; i++) { err = pthread_create(&tid_p[i - 1], NULL, thread_handler, (void*)argv[i]); if (err != 0) { fprintf(stderr, "[ERROR]pthread_product_create():\n", strerror(err)); exit(EXIT_FAILURE); } } // 创建消费者线程 for (i = 0; i < atoi(argv[argc - 1]); i++) { err = pthread_create(&tid_c[i], NULL, thread_handler_consume, NULL); if (err != 0) { fprintf(stderr, "[ERROR]pthread_consume_create():\n", strerror(err)); exit(EXIT_FAILURE); } } // 等待所有生产者线程完成 for (i = 0; i < argc - 2; i++) { pthread_join(tid_p[i], NULL); } // 设置生产完成标志 done = true; // 等待所有消费者线程完成 for (i = 0; i < atoi(argv[argc - 1]); i++) { pthread_join(tid_c[i], NULL); } printf("所有产品已消费完毕,程序结束。\n"); return 0; } 【图片】




