作业社区
探索学习新天地,共享知识资源!
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; }
+9
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; }
+9
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; }
+9
浪潮君 的学生作业:
#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
+9
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
+7
浪潮君 的学生作业:
#include #include #include #include // 定义一个结构体 Person,包含名字和年龄 typedef struct { char name[20]; int age; } Person; // 子线程的函数,用于创建并返回一个结构体指针 void *thread_func(void *) { // 动态分配结构体内存(分配到堆上,避免线程栈退出后失效) Person *p = malloc(sizeof(*p)); if (NULL == p) { perror("malloc failed"); pthread_exit(NULL); // 分配失败时,线程安全退出 } // 初始化结构体数据 strcpy(p->name, "Tom"); p->age = 28; // 将结构体指针作为线程返回值传递回主线程 return p; } int main(int argc, char *argv[]) { pthread_t tid; // 线程 ID Person *result = NULL; // 用于接收子线程返回的结构体指针 // 创建子线程,执行 thread_func 函数 if (pthread_create(&tid, NULL, thread_func, NULL) != 0) { perror("线程创建失败"); exit(EXIT_FAILURE); } // 等待子线程结束,并获取返回值(结构体指针) if (pthread_join(tid, (void **)&result) != 0) { perror("pthread_join"); exit(EXIT_FAILURE); } // 打印结构体内容(验证子线程传递的数据) if (result != NULL) { printf("姓名:%s\n", result->name); printf("年龄:%d\n", result->age); } // 释放堆内存,防止内存泄漏 free(result); return 0; }
+9
浪潮君 的学生作业:
#include #include #include #include // 线程A的函数 void *thread_A(void *arg) { for (int i = 0; i < 3; i++) { printf("线程A:第 %d 次执行\n", i + 1); sleep(1); // 模拟耗时操作 } pthread_exit(NULL); // 显式退出线程(可省略) } // 线程B的函数 void *thread_B(void *arg) { for (int i = 0; i < 3; i++) { printf("线程B:第 %d 次执行\n", i + 1); sleep(1); // 模拟耗时操作 } pthread_exit(NULL); } int main() { pthread_t tid_A, tid_B; // 声明两个线程ID // 创建线程A if (pthread_create(&tid_A, NULL, thread_A, NULL) != 0) { perror("创建线程A失败"); exit(EXIT_FAILURE); } // 创建线程B if (pthread_create(&tid_B, NULL, thread_B, NULL) != 0) { perror("创建线程B失败"); exit(EXIT_FAILURE); } // 设置线程A、B为分离状态: // 一旦线程执行完,系统自动释放资源,不需要主线程回收 pthread_detach(tid_A); pthread_detach(tid_B); // 因为线程是分离状态,主线程不能使用 join 来等待它们 // 为防止主线程提前退出,我们 sleep 一段时间,确保子线程有时间完成 sleep(5); // 等待足够的时间(3次sleep(1) ≈ 3秒,预留2秒缓冲) printf("主线程结束(不等待子线程)\n"); return 0; }
+9
浪潮君 的学生作业:
#include #include #include #include // 线程A的任务函数 void *thread_A(void *arg) { for (int i = 0; i < 5; i++) { printf("线程A正在运行,第 %d 次\n", i + 1); sleep(1); } return NULL; } // 线程B的任务函数 void *thread_B(void *arg) { for (int i = 0; i < 5; i++) { printf("线程B正在运行,第 %d 次\n", i + 1); sleep(1); } return NULL; } int main() { pthread_t tid_A, tid_B; // 创建线程A if (pthread_create(&tid_A, NULL, thread_A, NULL) != 0) { perror("创建线程A失败"); exit(EXIT_FAILURE); } // 创建线程B if (pthread_create(&tid_B, NULL, thread_B, NULL) != 0) { perror("创建线程B失败"); exit(EXIT_FAILURE); } // 等待两个线程执行结束 pthread_join(tid_A, NULL); pthread_join(tid_B, NULL); printf("主线程结束。\n"); return 0; }
+9
浪潮君 的学生作业:
#include #include #include #include #include #include #include #define LOOP_COUNT 10 // 定义循环次数(输出多少行) #define OUTPUT_FILE "output.txt" // 输出文件名 int main() { int pipefd[2]; // pipefd[0] 是读端,pipefd[1] 是写端。用于父子进程间同步通信 // 创建管道,pipefd[0] 为读端,pipefd[1] 为写端 if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } // 创建子进程 pid_t pid = fork(); if (pid < 0) { perror("fork"); exit(EXIT_FAILURE); } if (pid == 0) { // ---------------------- 子进程逻辑 ---------------------- close(pipefd[1]); // 子进程不写管道,只用读管道,所以关闭写端 // 子进程单独打开输出文件(使用追加模式),防止和父进程共享文件描述符冲突 int fd = open(OUTPUT_FILE, O_WRONLY | O_APPEND); if (fd == -1) { perror("child open"); exit(EXIT_FAILURE); } for (int i = 1; i
+7