C语言多线程打印输出错乱问题排查求助
问题描述
我用C语言实现多线程程序,需求是每个线程读取CSV文件的指定行(每行包含4个浮点数),并将读取的值存入各自的矩阵中。目前已实现数据读取功能,但打印各线程的矩阵时出现输出重叠错乱的情况。不确定是控制台打印的并发冲突,还是CSV文件访问的并发问题,也无法确认CSV的行数据是否已正确加载到矩阵中。
相关代码
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #define NTHREADS 15 #define NTRAIN 135 #define NFEATURES 4 #define X_TRAIN_PATH "C:/Users/tecnico/Desktop/UniME/Materie/HPC/MPI/Programs/Multithreading/X_train.csv" void checkFile(FILE *f) { if (f == NULL) { printf("Error while reading file\n"); exit(1); } } float *getFloatMat(int m, int n) { float *mat = NULL; mat = (float *)calloc(m * n, sizeof(float)); return mat; } float *initFeatures(char path[], int start_row, int end_row) { int index = 0; FILE *f = NULL; float *mat = NULL; mat = getFloatMat(end_row - start_row + 1, NFEATURES); f = fopen(path, "r"); checkFile(f); // 跳过start_row之前的行 for (int i = 0; i < start_row; i++) while (fgetc(f) != '\n') ; // 读取从start_row到end_row的数据 for (int i = start_row; i <= end_row; i++) { for (int j = 0; j < NFEATURES; j++) { fscanf(f, "%f%*c", &mat[index]); index++; } } fclose(f); return mat; } struct ThreadData { int thread_id; int start_row; int end_row; float *x_train; }; void *threadFunction(void *arg) { struct ThreadData *data = (struct ThreadData *)arg; // 初始化当前线程的矩阵 data->x_train = initFeatures(X_TRAIN_PATH, data->start_row, data->end_row); // 打印当前线程的矩阵 printf("Thread %d:\n", data->thread_id); for (int i = 0; i <= data->end_row - data->start_row; i++) { for (int j = 0; j < NFEATURES; j++) { printf("%.2f ", data->x_train[i * NFEATURES + j]); } printf("\n\n"); } // 释放矩阵内存 free(data->x_train); pthread_exit(NULL); } int main(int argc, char const *argv[]) { pthread_t threads[NTHREADS]; struct ThreadData thread_data[NTHREADS]; int rows_per_thread = NTRAIN / NTHREADS; // 创建并启动线程 for (int i = 0; i < NTHREADS; i++) { thread_data[i].thread_id = i; thread_data[i].start_row = i * rows_per_thread + 1; thread_data[i].end_row = (i + 1) * rows_per_thread; pthread_create(&threads[i], NULL, threadFunction, (void *)&thread_data[i]); } // 等待线程结束 for (int i = 0; i < NTHREADS; i++) { pthread_join(threads[i], NULL); } return 0; }
异常输出
Thread 8:
6.00 2.70 5.10 1.606.10 3.00 4.90 1.80
5.90 Thread 13:
5.40 3.40 1.50 0.405.50 3.50 1.30 0.20
6.70 3.00 5.20 2.30
5.50 2.40 3.80 1.10
4.80 3.40 1.90 0.20
4.60 Thread 9:
6.00 3.60 1.00 0.205.20 3.50 1.50 0.20
4.90 3.00 1.40 0.20
5.40 3.00 4.50 1.50
3.00 4.80 1.80
6.30 2.70 4.90 1.80
6.40 2.90 4.30 1.30
5.10 3.50 1.40 0.30
6.60 2.90 4.60 1.30
6.80 2.80 4.80 1.40
5.40 3.90 1.70 0.40
5.20 3.40 1.40 0.20
4.80 3.00 1.40 0.30
Thread 5:
4.80 3.00 1.40 0.105.80 2.80 5.10 2.40
5.80 2.70 4.10 1.00
4.90 2.40 3.30 1.00
6.20 2.80 4.80 1.80
5.00 3.40 1.50 0.20
6.80 3.00 5.50 2.10
5.60 2.50 3.90 1.10
5.60 2.80 4.90 2.00
Thread 0:
4.80 Thread 1:
3.40 1.60 0.205.80 2.70 3.90 1.20
6.70 3.30 5.70 2.50
6.10 3.00 4.60 1.40
6.40 3.20 5.30 2.30
7.30 2.90 6.30 1.80
5.70 2.80 4.10 1.30
5.50 4.20 1.40 0.20
6.70 3.10 5.60 2.40
Thread 4:
5.80 2.60 4.00 1.205.60 3.00 4.10 1.30
5.50 2.50 4.00 1.30
5.80 2.70 5.10 1.90
5.00 3.30 1.40 0.20
5.10 2.50 3.00 1.10
4.90 3.10 1.50 0.10
5.10 3.80 1.90 0.40
5.60 2.70 4.20 1.30
Thread 11:
6.40 2.70 5.30 1.905.70 3.80 1.70 0.30
6.90 3.10 5.40 2.10
7.70 2.60 6.90 2.30
6.10 2.80 4.70 1.20
6.30 3.40 5.60 2.40
7.70 3.00 6.10 2.30
6.80 3.20 5.90 2.30
4.60 3.40 1.40 0.30
3.00 5.10 1.80
5.50 2.30 4.00 1.30
5.70 2.50 5.00 2.00
6.50 3.00 5.50 1.80
5.90 3.20 4.80 1.80
6.10 2.60 5.60 1.40
6.90 3.10 5.10 2.30
Thread 2:
6.00 3.40 4.50 1.605.60 3.00 4.50 1.50
5.40 3.90 1.30 0.40
6.90 3.10 4.90 1.50
4.90 2.50 4.50 1.70
6.40 2.80 5.60 2.10
6.00 2.90 4.50 1.50
5.00 2.30 3.30 1.00
7.20 3.60 6.10 2.50
6.70 3.00 5.00 1.70
5.40 3.40 1.70 0.20
6.10 2.90 4.70 1.40
5.00 3.00 1.60 0.20
5.70 3.00 4.20 1.20
5.00 3.50 1.60 0.60
5.20 2.70 3.90 1.40
6.90 3.20 5.70 2.30
7.40 2.80 6.10 1.90
Thread 6:
5.10 3.40 1.50 0.205.20 4.10 1.50 0.10
6.30 2.90 5.60 1.80
6.70 3.30 5.70 2.10
5.70 2.80 4.50 1.30
7.10 3.00 5.90 2.10
6.40 3.10 5.50 1.80
7.20 3.20 6.00 1.80
6.00 2.20 4.00 1.00
Thread 3:
5.10 3.80 1.60 0.204.50 2.30 1.30 0.30
4.90 3.10 1.50 0.10
6.30 3.30 4.70 1.60
4.40 3.20 1.30 0.20
6.30 3.30 6.00 2.50
7.20 3.00 5.80 1.60
4.80 3.10 1.60 0.20
6.30 2.50 5.00 1.90
Thread 14:
5.00 3.40 1.60 0.406.50 3.00 5.20 2.00
5.00 3.50 1.30 0.30
4.70 3.20 1.60 0.20
5.70 2.90 4.20 1.30
5.50 2.40 3.70 1.00
6.40 2.80 5.60 2.20
6.30 2.80 5.10 1.50
0.00 0.00 0.00 0.00
Thread 7:
6.20 2.90 4.30 1.306.50 3.00 5.80 2.20
7.70 2.80 6.70 2.00
4.30 3.00 1.10 0.10
5.80 2.70 5.10 1.90
6.30 2.50 4.90 1.50
5.10 3.80 1.50 0.30
4.40 2.90 1.40 0.20
6.70 2.50 5.80 1.80
Thread 10:
5.80 4.00 1.20 0.204.60 3.20 1.40 0.20
7.00 3.20 4.70 1.40
6.20 3.40 5.40 2.30
6.60 3.00 4.40 1.40
5.90 3.00 4.20 1.50
6.70 3.10 4.70 1.50
5.00 3.20 1.20 0.20
5.70 2.60 3.50 1.00
Thread 12:
6.70 3.10 4.40 1.405.40 3.70 1.50 0.20
6.30 2.30 4.40

