
作业社区
探索学习新天地,共享知识资源!
浪潮君 的学生作业:
#include #include #include #include #include // ------------------- 宏定义 ------------------- #define MAX_CONSUMERS 3 // 消费者线程的最大数量 // ------------------- 全局共享资源 ------------------- static int number = 0; // 当前库存产品数量(共享变量) static int total_of_produce = 0; // 所有生产者线程总共要生产的产品数量 static int total_of_consume = 0; // 所有消费者线程总共已消费的产品数量 // ------------------- 线程同步工具 ------------------- static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; // 互斥锁,保护临界区(库存、总量等) static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // 条件变量,用于线程等待/唤醒 // ------------------- 结构体:线程参数 ------------------- typedef struct { int count; // 当前生产者线程要生产的产品数量 int id; // 当前线程编号(从 1 开始) } ProducersArg; // ------------------- 生产者线程函数 ------------------- void *producer_thread(void *arg) { ProducersArg *parg = (ProducersArg *) arg; for (int i = 0; i < parg->count; i++) { pthread_mutex_lock(&mtx); // 进入临界区,锁定资源 number++; // 库存 +1 printf("生产者[%d] 生产了一个产品,总库存:%d\n", parg->id, number); pthread_cond_broadcast(&cond); // 唤醒所有消费者线程(库存可能可消费了) pthread_mutex_unlock(&mtx); // 解锁,退出临界区 usleep(random() % 500000); // 模拟生产耗时(0~0.5 秒) } free(parg); // 释放传入的参数结构体(堆内存) return NULL; } // ------------------- 消费者线程函数 ------------------- void *consumer_thread(void *arg) { int id = *(int *) arg; // 取出线程编号 free(arg); // 释放编号内存(主线程 malloc 的) while (true) { pthread_mutex_lock(&mtx); // 锁住临界区 // 如果已经消费完所有产品,就退出等待 while (total_of_consume >= total_of_produce) pthread_cond_wait(&cond, &mtx); // 等待生产者唤醒 // 二次判断:是否所有产品都消费完 if (total_of_consume >= total_of_produce) { pthread_mutex_unlock(&mtx); // 解锁后退出 break; } number--; // 消费一个产品 total_of_consume++; // 消费计数器 +1 printf("消费者[%d] 消费了一个产品,剩余库存:%d\n", id, number); pthread_mutex_unlock(&mtx); // 解锁临界区 usleep(random() % 500000); // 模拟消费耗时 } return NULL; } // ------------------- 主线程函数 ------------------- int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "用法: %s ...\n", argv[0]); exit(EXIT_FAILURE); } int num_producers = argc - 1; // 生产者线程数 = 参数数量 - 程序名 pthread_t producers[num_producers]; // 生产者线程 ID 数组 pthread_t consumers[MAX_CONSUMERS]; // 消费者线程 ID 数组 // 创建生产者线程 for (int i = 0; i < num_producers; i++) { char *endptr = NULL; long val = strtol(argv[i + 1], &endptr, 10); // 解析参数 // 参数非法判断:必须是正整数 if (*endptr != '\0' || val count = count; parg->id = i + 1; // 线程编号从 1 开始 // 创建线程 if (pthread_create(&producers[i], NULL, producer_thread, parg) != 0) { perror("pthread_create(生产者)"); free(parg); exit(EXIT_FAILURE); } } // 创建消费者线程 for (int i = 0; i < MAX_CONSUMERS; i++) { int *cid = malloc(sizeof(int)); if (!cid) { perror("malloc"); exit(EXIT_FAILURE); } *cid = i + 1; // 编号从 1 开始 if (pthread_create(&consumers[i], NULL, consumer_thread, cid) != 0) { perror("pthread_create(消费者)"); free(cid); exit(EXIT_FAILURE); } } // 等待所有生产者线程结束 for (int i = 0; i < num_producers; i++) { pthread_join(producers[i], NULL); } // 等待所有消费者线程结束 for (int i = 0; i < MAX_CONSUMERS; i++) { pthread_join(consumers[i], NULL); } // 销毁同步资源 pthread_mutex_destroy(&mtx); pthread_cond_destroy(&cond); printf("所有产品已被消费完毕,总共消费 %d 个\n", total_of_consume); return 0; }





Linkus 的学生作业:
#include #include #include #include static int global = 0; static 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); } pthread_mutex_init(&mutex,NULL); 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); pthread_mutex_destroy(&mutex); printf("global = %d\n",global); return 0; }





Linkus 的学生作业:
linkus@windwaker:~/Desktop/windwaker/linkus/Process&Thread&IO/Thread/Code $ ./build/thread_arg_c2p_home_thread Name Age #include #include #include #include typedef struct person { char name[10]; unsigned int age; }person_t; void *thread(void *arg) { static person_t xiaoming; strcpy(xiaoming.name,"LiMing"); xiaoming.age = 18; pthread_exit((void *)&xiaoming); } int main() { pthread_t tid; int err; person_t *ming; err = pthread_create(&tid,NULL,thread,NULL); if(err != 0){ fprintf(stderr,"[ERROR] pthread_create(): %s \n",strerror(err)); exit(EXIT_FAILURE); } pthread_join(tid,(void *)&ming); printf("Name Age \n",ming->name,ming->age); return 0; }





Linkus 的学生作业:
/* 创建二个线程,并使两个线程分离 */ #include #include #include #include #include void *thread1(void *arg) { printf("Thread 1 start.\n"); pthread_exit(NULL); } void *thread2(void *arg) { printf("Thread 2 start.\n"); pthread_exit(NULL); } int main(void) { int err; pthread_t tid1, tid2; err = pthread_create(&tid1,NULL,thread1,NULL); if (err != 0){ fprintf(stderr,"[ERROR] pthread_create : < %s >\n",strerror(err)); exit(EXIT_FAILURE); } pthread_detach(tid1); err = pthread_create(&tid2,NULL,thread2,NULL); if (err != 0){ fprintf(stderr,"[ERROR] pthread_create : < %s >\n",strerror(err)); exit(EXIT_FAILURE); } pthread_detach(tid2); printf(" tid1 = %ld\n",tid1); printf(" tid2 = %ld\n",tid2); return 0; }





Linkus 的学生作业:
#include #include #include #include #include void *thread1(void *arg) { printf("Thread 1 start.\n"); pthread_exit(NULL); } void *thread2(void *arg) { printf("Thread 2 start.\n"); pthread_exit(NULL); } int main(void) { int err; pthread_t tid1, tid2; err = pthread_create(&tid1,NULL,thread1,NULL); if (err != 0){ fprintf(stderr,"[ERROR] pthread_create : < %s >\n",strerror(err)); exit(EXIT_FAILURE); } printf(" tid1 = %ld\n",tid1); err = pthread_create(&tid2,NULL,thread2,NULL); if (err != 0){ fprintf(stderr,"[ERROR] pthread_create : < %s >\n",strerror(err)); exit(EXIT_FAILURE); } printf(" tid2 = %ld\n",tid2); sleep(0.5); return 0; }





浪潮君 的学生作业:
#include #include #include #include // 全局变量,所有线程共享,用于计数 static int global = 0; // 互斥锁,用于保护对 global 的并发访问 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 线程函数:每个线程执行 loops 次 global++ void *do_thread(void *arg) { // 将通用指针 arg 转换为 int*,再解引用取值 int loops = *(int *) arg; // 每次循环加锁、修改 global、解锁 for (int i = 0; i < loops; i++) { pthread_mutex_lock(&mutex); // 加锁,防止其他线程同时访问 global global++; // 累加全局变量 pthread_mutex_unlock(&mutex); // 解锁,允许其他线程进入 } return NULL; // 返回 NULL 表示无返回值 } int main(int argc, char *argv[]) { // ---------------- 参数校验开始 ---------------- // 程序需要一个参数,作为每个线程的循环次数 if (argc != 2) { fprintf(stderr, "参数错误!\n"); fprintf(stderr, "用法:%s \n", argv[0]); fprintf(stderr, "示例:%s 100000\n", argv[0]); fprintf(stderr, "说明:必须传入一个正整数作为参数,表示每个线程执行的加法次数。\n"); exit(EXIT_FAILURE); } // ---------------- 参数解析(strtol 更安全) ---------------- char *endptr = NULL; // 将字符串转换为 long 类型,支持输入较大的数字 long val = strtol(argv[1], &endptr, 10); // base 10 表示十进制 // 检查是否为纯数字,是否为正数 if (*endptr != '\0' || val





Linkus 的学生作业:
/* * 创建一个子进程,将当前系统时间按照 1, 格式写入到文件中,具体要求如下: * 1.由父进程写入1,< ,这里是序号,需要不断增加 * 2.由子进程写入当前时间 * 3.由父进程写入 >\n * 4.至少循环10次 */ #include #include #include #include #include #include "sem.h" #define SEM_NUM 2 #define LOG_FILE "./log.txt" #define LOOP_NUM 10 int main(){ int sem_id; pid_t pid; FILE *log; int idx = 1; /* Create semaphone */ unsigned short sem_val[SEM_NUM] = {1,0}; sem_id = sem_create(SEM_NUM,sem_val); if(sem_id == -1) {perror("[ERR] sem_create : "); exit(-1);} /* Create Log File */ log = fopen(LOG_FILE,"w"); if(log == NULL) {perror("[ERR] fopen : "); exit(-1);} /* Create child process */ pid = fork(); if(pid == 1) {perror("[ERR] ftok : "); exit(-1);} /* Child Process */ if(pid == 0) { time_t now; struct tm *timeinfo; char time_str[20]; while(idx 0) { while(idx




