You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(&params);
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:15:06