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

使用pthreads的多线程二维数组代码无输出问题求助

你的pthreads代码问题分析与修复方案

嘿,别着急,我帮你找出了代码里几个关键问题,这就是程序运行后没反应的原因:

核心问题点

  • 主线程过早退出,子线程根本没机会执行
    你在main函数里创建完线程后直接return 0了——主线程一退出,整个进程会立刻终止,子线程连启动执行输入提示的机会都没有。必须用pthread_join等待子线程完成任务后,主线程再退出。

  • 未初始化屏障(pthread_barrier)
    你声明了pthread_barrier_t our_barrier,但从来没调用pthread_barrier_init初始化它。直接调用pthread_barrier_wait会触发未定义行为。而且当前代码只有一个子线程,屏障完全是多余的,要么移除要么正确初始化。

  • 多余的done变量判断逻辑
    done被初始化为2,子线程里判断done != (int)*(int*)k(k是1),这个条件虽然成立,但变量的作用完全没体现出来,反而容易让人困惑,建议要么明确它的用途,要么直接移除这个判断。

  • 输入输出的格式问题
    打印二维数组时没有换行,所有数字会挤在一起;输入n和d的时候可以给更清晰的提示,避免用户不知道该输入什么。

修复后的完整代码

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

// 移除多余的屏障,当前单线程场景用不到
// pthread_barrier_t our_barrier;
// int done = 2;

void *threadfunc2(void *k) {
    // 移除无意义的done判断
    int n, d, i, j;
    printf("请输入二维表格的行数:\n");
    scanf("%d", &n);
    printf("请输入二维表格的列数:\n");
    scanf("%d", &d);
    
    // 变长数组没问题,若需处理大尺寸表格建议用动态分配
    int array[n][d];
    
    printf("请输入二维表格的元素(每行%d个数字):\n", d);
    for (i = 0; i < n; i++) {
        for (j = 0; j < d; j++) {
            scanf("%d", &array[i][j]);
        }
    }
    
    printf("你输入的二维表格是:\n");
    for (i = 0; i < n; i++){
        for (j = 0; j < d; j++){
            printf("%d ", array[i][j]);
        }
        printf("\n"); // 每行结束换行,提升可读性
    }
    
    printf("Now finished!!!\n");
    return NULL;
}

int main() {
    int k = 1;
    pthread_t tid1;
    
    // 增加线程创建失败的错误检查
    int ret = pthread_create(&tid1, NULL, threadfunc2, (void *)&k);
    if (ret != 0) {
        perror("创建线程失败");
        exit(EXIT_FAILURE);
    }
    
    // 等待子线程执行完成后再退出主线程
    pthread_join(tid1, NULL);
    
    return 0;
}

额外小贴士

  • 如果之后需要用多线程配合屏障,记得在使用前调用pthread_barrier_init(&our_barrier, NULL, 线程总数),用完后调用pthread_barrier_destroy(&our_barrier)清理资源。
  • 变长数组在栈上分配,如果n和d太大可能会导致栈溢出,这种情况建议用malloc动态分配内存:
    int **array = malloc(n * sizeof(int*));
    for (int i=0; i<n; i++) {
        array[i] = malloc(d * sizeof(int));
    }
    // 使用完记得释放内存
    for (int i=0; i<n; i++) {
        free(array[i]);
    }
    free(array);
    

内容的提问来源于stack exchange,提问作者Dimitris Kastritis JkProductio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:06:32