linux c多个线程分段读取一个文件

发布时间:2024年01月15日

在 Linux C 中,你可以使用 pthread 库来创建多线程,并使用文件 I/O 来对文件进行读取和写入操作。以下是一个简单的示例代码,演示如何在 C 语言中开启 8 个线程同时读取一个文件并将其分成 8 段保存到 8 个临时文件中:

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

#define NUM_THREADS 8

// 结构体用于传递参数给线程函数
struct ThreadArgs {
    FILE *inputFile;
    FILE *outputFile;
    size_t startOffset;
    size_t endOffset;
};

// 线程函数,用于将文件分段读取并保存到临时文件中
void *readAndWriteFile(void *threadArgs) {
    struct ThreadArgs *args = (struct ThreadArgs *)threadArgs;
    size_t blockSize = args->endOffset - args->startOffset + 1;

    fseek(args->inputFile, args->startOffset, SEEK_SET);
    char *buffer = malloc(blockSize);
    fread(buffer, blockSize, 1, args->inputFile);

    fseek(args->outputFile, args->startOffset, SEEK_SET);
    fwrite(buffer, blockSize, 1, args->outputFile);

    fclose(args->outputFile);
    free(buffer);
    pthread_exit(NULL);
}

int main() {
    FILE *inputFile = fopen("input.txt", "r");
    if (inputFile == NULL) {
        perror("Error opening input file");
        return 1;
    }

    // 创建 8 个临时文件
    FILE *outputFiles[NUM_THREADS];
    for (int i = 0; i < NUM_THREADS; i++) {
        char filename[20];
        sprintf(filename, "output%d.txt", i);
        outputFiles[i] = fopen(filename, "w");
        if (outputFiles[i] == NULL) {
            perror("Error creating output file");
            return 1;
        }
    }

    // 计算每个线程读取的数据块大小
    fseek(inputFile, 0, SEEK_END);
    size_t fileSize = ftell(inputFile);
    size_t blockSize = fileSize / NUM_THREADS;
    size_t lastBlockSize = fileSize - (blockSize * (NUM_THREADS - 1));

    pthread_t threads[NUM_THREADS];
    struct ThreadArgs threadArgs[NUM_THREADS];

    // 创建线程,每个线程读取文件的一部分并保存到临时文件中
    for (int i = 0; i < NUM_THREADS; i++) {
        threadArgs[i].inputFile = inputFile;
        threadArgs[i].outputFile = outputFiles[i];
        threadArgs[i].startOffset = i * blockSize;
        threadArgs[i].endOffset = (i == NUM_THREADS - 1) ? (blockSize * (i+1) + lastBlockSize - 1) : (blockSize * (i+1) - 1);
        pthread_create(&threads[i], NULL, readAndWriteFile, (void *)&threadArgs[i]);
    }

    // 等待所有线程结束
    for (int i = 0; i < NUM_THREADS; i++) {
        pthread_join(threads[i], NULL);
    }

    printf("File divided and saved to temporary files successfully.\n");

    fclose(inputFile);
    for (int i = 0; i < NUM_THREADS; i++) {
        fclose(outputFiles[i]);
    }

    return 0;
}

在上面的示例中,我们使用了 pthread 库来创建了 8 个线程,并使用文件 I/O 对文件进行读取和写入操作,将文件平均分成 8 段保存到 8 个临时文件中。在主函数中,我们首先打开了输入文件,然后创建了 8 个临时文件。随后计算并分配了每个线程的读取范围,并创建了 8 个线程来处理文件的读取和写入操作。最后等待所有线程的执行完毕,关闭所有文件,并结束了程序。
要计算从 fopenreturn 0 之间的时间,你可以使用 clock() 函数来获取程序执行的 CPU 时间。此外,你还可以使用 time() 函数来获取当前时间戳。以下是一个简单的示例代码,演示了如何在程序中添加时间戳并计算程序执行的时间:

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

#define NUM_THREADS 8

// 结构体用于传递参数给线程函数
struct ThreadArgs {
    FILE *inputFile;
    FILE *outputFile;
    size_t startOffset;
    size_t endOffset;
};

// 线程函数,用于将文件分段读取并保存到临时文件中
void *readAndWriteFile(void *threadArgs) {
    // ...(省略线程函数的实现)
}

int main() {
    clock_t start, end;
    double cpu_time_used;
    start = clock(); // 记录程序开始执行的 CPU 时间

    time_t rawtime;
    struct tm *timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    printf("Start time: %s", asctime(timeinfo)); // 打印程序开始执行的时间

    FILE *inputFile = fopen("input.txt", "r");
    if (inputFile == NULL) {
        perror("Error opening input file");
        return 1;
    }

    // ...(省略创建临时文件和线程的代码)

    end = clock(); // 记录程序结束执行的 CPU 时间
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    printf("CPU time used: %f seconds\n", cpu_time_used); // 打印程序执行的 CPU 时间

    time(&rawtime);
    timeinfo = localtime(&rawtime);
    printf("End time: %s", asctime(timeinfo)); // 打印程序结束执行的时间

    fclose(inputFile);
    // ...(省略关闭临时文件和线程的代码)

    return 0;
}

在上面的示例中,我们首先使用 clock() 函数记录了程序开始执行的 CPU 时间,并使用 time() 函数获取了程序开始执行的时间戳,并打印出来。在程序执行结束后,我们再次使用 clock() 函数记录了程序结束执行的 CPU 时间,并再次使用 time() 函数获取了程序结束执行的时间戳,并打印出来。最后,我们计算了程序执行的 CPU 时间,并打印出来。

文章来源:https://blog.csdn.net/weixin_38849487/article/details/135595123
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。