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

C语言多线程打印输出错乱问题排查求助

多线程CSV读取与打印错乱问题排查与修复

问题描述

我用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.60

6.10 3.00 4.90 1.80

5.90 Thread 13:
5.40 3.40 1.50 0.40

5.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.20

5.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.10

5.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.20

5.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.20

5.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.90

5.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.60

5.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.20

5.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.20

4.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.40

6.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.30

6.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.20

4.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.40

5.40 3.70 1.50 0.20

6.30 2.30 4.40

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 23:56:42