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

这篇具有很好参考价值的文章主要介绍了linux c多个线程分段读取一个文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 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://www.toymoban.com/news/detail-790574.html

到了这里,关于linux c多个线程分段读取一个文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用c/c++语言写一个简单的学生信息管理系统(使用结构体数组,包含文件储存,文件读取等)

    使用c/c++开发的一个简单学生信息管理系统,功能如图所示: 选择不同的数字后可以选择不同的功能使用 在刚开始运行系统时会进行一个系统暂停,使用了windows函数库里面的system(\\\"pause\\\"),暂停系统有助于保护系统稳定性,防止系统出现闪屏等意外情况导致闪退等,并且使用了

    2024年02月09日
    浏览(42)
  • R语言【utils】——read.table():以表格式读取文件,并从中创建一个数据帧,其中大小写对应于行,变量对应于文件中的字段。

    Package  utils  version 4.2.0 参数【file】 :要从中读取数据的文件的名称。表的每一行为文件的一行。如果不包含绝对路径,则文件名相对于当前工作目录 getwd() 。在支持的地方执行波浪运算符扩展。这可以是一个压缩文件。或者, 参数【file】 可以是一个可读的文本模式连接

    2024年02月02日
    浏览(43)
  • springboot的配置文件如何配置可以实现多个yml相互读取

    在Spring Boot中,可以通过多种方式来实现配置文件的相互读取和组合。如果你想要在一个Spring Boot应用中使用多个YAML( .yml )配置文件,并且希望这些配置文件可以相互读取或者互相覆盖某些配置,你可以采用以下几种方法: 1. 使用 spring.config.import 属性(Spring Boot 2.4及以上版

    2024年02月20日
    浏览(47)
  • Python 性能优化|多线程读取文件

    多进程可以实现逐行遍历同一个文件(可以保证每一个进程遍历的行都是完整且互不重复的),且可以提高遍历性能。 多进程 / 多线程遍历文件速度 单进程、多线程读取同一个文件时,每个线程的运行时间并不能随线程数的增加的降低; 多进程读取同一个文件时,每个进程

    2024年02月09日
    浏览(38)
  • 【运维】手把手教你在Linux/Windows系统使用Nginx部署多个前端项目【详细操作】

            需求:项目上线需要将前端的前台和后台部署在服务器上提供用户进行使用,部署在不同的服务器直接在服务器安装nginx即可。但是在内网安装还是有点麻烦,因为需要联网,如果是内网可以参考Linux安装Nginx并部署前端项目【内/外网-保姆级教程】_MXin5的博客-CSDN博

    2024年02月08日
    浏览(58)
  • IO线程,文件IO(open),文件(stat)与目录(opendir)属性的读取

          一、文件IO 1、文件io通过系统调用来操作文件 系统调用:系统提供给用户的一组API(接口函数)         open/read/write/close/lseek... 用户空间进程访问内核的接口 把用户从底层的硬件编程中解放出来 极大的提高了系统的安全性 使用户程序具有可移植性(同一系统下) 是操作

    2024年02月11日
    浏览(38)
  • lammps教程:多个dump文件合并为一个文件

    大家好,我是小马老师。 本文介绍多个dump文件合并为一个dump文件的方法。 在前面的文章中,介绍过python ovito可以把一个dump文件按帧拆分为多个dump文件。 同理,多个dump文件也可以合并为一个dump文件。 基本原理是先读入多个dump文件,然后再合并输出为一个单独的文件。

    2023年04月09日
    浏览(162)
  • IO进程线程,文件IO(open),文件(stat)与目录(opendir)属性的读取

          一、文件IO 1、文件io通过系统调用来操作文件 系统调用:系统提供给用户的一组API(接口函数)         open/read/write/close/lseek... 用户空间进程访问内核的接口 把用户从底层的硬件编程中解放出来 极大的提高了系统的安全性 使用户程序具有可移植性(同一系统下) 是操作

    2024年02月11日
    浏览(35)
  • Qt界面编程(四)—— QMainWindow(一个菜单栏、多个工具栏、多个停靠部件、一个状态栏、一个中心部件)、资源文件

    目录 1. 菜单栏 2. 工具栏 3. 状态栏 4. 停靠部件(也称为铆接部件、浮动窗口) 5. 核心部件(中心部件) 6. 使用UI文件创建窗口 6.1 UI设计窗口介绍 6.2 菜单栏 6.2.1 添加/删除菜单栏 6.2.2 添加菜单 6.2.3 添加菜单项 6.2.4 添加多级菜单 6.3 工具栏 6.3.1 添加/删除工具栏 6.3.

    2024年01月22日
    浏览(51)
  • 【python】多线程下载m3u8分段视频

    1.说明 m3u8是一种传输数据的方式,比如说一集20分钟的完整视频被分割成一千多段一两秒的小视频,客户端播放的时候是感觉是连续,但如果你要下载这集视频,那就要把一千多个小视频全都下载然后自己拼接成一个完整视频。拼接的话很简单,像格式工厂等很多软件都可以

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包