使用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
相关产品推荐
相关产品推荐

