
作业社区
探索学习新天地,共享知识资源!
北城半夏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; }





北城半夏4806197 的学生作业:
#include #include #include #include #include static int number = 0;//共享变量 pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; void *thread_handler(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_mutex_unlock(&mtx); } pthread_exit((void *)0); } int main(int argc,char *argv[]) { pthread_t tid; int i; int err; int total_of_produce = 0;//总的生产产品的数量 int total_of_consume = 0;//总的消费产品的数量 bool done = false; for (i = 1;i < argc;i++){ total_of_produce += atoi(argv[i]); // 生产数量的总和 err = pthread_create(&tid,NULL,thread_handler,(void *)argv[i]); if (err != 0) { perror("pthread_create()"); exit(EXIT_FAILURE); } } for (;;){ pthread_mutex_lock(&mtx); while(number > 0){ total_of_consume++; // 消费产品总数 printf("消费一个产品,产品数量为:%d\n",--number); done = total_of_consume >= total_of_produce; // 判断消费者数量与产品数量 sleep(1); } pthread_mutex_unlock(&mtx); if (done) break; } return 0; }





北城半夏4806197 的学生作业:
#include #include #include #include static int global = 0; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void *do_thread(void *arg) { int loops = *(int *)arg; int i,tmp = 0; for (i = 0;i < loops;i++){ pthread_mutex_lock(&mutex); tmp = global; tmp++; global = tmp; pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } int main(int argc,char *argv[]) { int err,i = 0; pthread_t tid[2] = {0}; int loops = 0; if (argc != 2){ fprintf(stderr,"Usage : < %s > < count loops>\n",argv[0]); exit(EXIT_FAILURE); } loops = atoi(argv[1]); for (i = 0;i < 2;i++){ err = pthread_create(&tid[i],NULL,do_thread,&loops); if (err != 0){ fprintf(stderr,"[ERROR] pthread_create(): < %s > \n",strerror(err)); exit(EXIT_FAILURE); } } pthread_join(tid[0],NULL); pthread_join(tid[1],NULL); printf("global = %d\n",global); return 0; }




