C语言pthread多线程场景下如何传递父线程ID并正确打印
解决方案
核心修改点
- 补充缺失的头文件:
<stdio.h>(printf功能依赖)、<pthread.h>(pthread库函数依赖) - 扩展线程传参结构体
parameter_t,新增parent_id字段存储父线程的自定义编号 - 根线程(主线程启动的第一个tree线程)初始化参数时,父ID可以设为-1标识无父线程
- 创建子线程传参时,将当前线程的
thread_number赋值给子线程参数的parent_id字段 - 修改打印语句,输出
parent_id字段即可
完整修改后代码
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <pthread.h> typedef struct parameter { unsigned int amount_children; int thread_number; int parent_id; // 新增父线程编号字段 } parameter_t; #define MAX_CHILDTHREADS 16 #define N_ZERO 4 unsigned int countthreads = 0; unsigned int divisor = 2; pthread_mutex_t count_mutex; pthread_attr_t attr; void * tree(void*); int main(){ pthread_t th; pthread_attr_init(&attr); pthread_mutex_init(&count_mutex,NULL); // 根线程编号为0,父ID设为-1标识无上级线程 parameter_t params = { N_ZERO*divisor, countthreads, -1}; tree(¶ms); printf("Total amount of created Threads %d \n", countthreads); return 0; } void * tree(void * args){ parameter_t* paramArgs = (parameter_t*) args; int N_threads = paramArgs->amount_children / divisor; int amount_childthreads = (N_threads <= MAX_CHILDTHREADS) ? N_threads : MAX_CHILDTHREADS; pthread_t threads[amount_childthreads]; // 打印父ID printf("I am %d and I have %d child(dren), my parent is %d\n", paramArgs->thread_number, amount_childthreads, paramArgs->parent_id); parameter_t param[ amount_childthreads ]; for(int i = 0; i < amount_childthreads; i++){ pthread_mutex_lock( &count_mutex ); int j = ++countthreads; pthread_mutex_unlock( &count_mutex ); param[i].amount_children = N_threads; param[i].thread_number = j; // 当前线程的编号就是子线程的父ID param[i].parent_id = paramArgs->thread_number; pthread_create( threads+i, &attr, &tree, param + i ); } for(int i = 0; i < amount_childthreads; i++){ pthread_join(threads[i],NULL); } printf("I am %d and done\n",paramArgs->thread_number); return NULL; }
编译运行说明
编译时需要链接pthread库,命令如下:gcc test.c -o test -pthread
运行后根线程(编号0)父ID为-1,它创建的所有一级子线程父ID为0,二级子线程父ID为对应一级子线程的编号,符合需求逻辑。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

