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 时间,并打印出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/624210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【科普】API接口——线上销售的秘密武器

什么是API&#xff1f; API全称为Application Programming Interface&#xff0c;中文是应用程序编程接口。它其实是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工…

为什么我说小公司也一定要用K8S

Kubernetes是谷歌以Borg为前身&#xff0c;基于谷歌15年生产环境经验开源的一个项目。Kubernetes致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台&#xff0c;其遵循主从式架构设计&#xff0c;其组件可以分为工作节点&#xff08;Node&#xff09;组…

第十三讲_css 伸缩盒模型flex

css 伸缩盒模型flex 1. 伸缩盒模型介绍2. 伸缩盒模型的主轴方向3. 伸缩盒模型的主轴换行4. 主轴上的对齐方式5. 侧轴上对齐方式5.1 一行的侧轴上对齐方式5.2 多行的侧轴上对齐方式 6. 伸缩项目的伸缩性6.1 伸缩项目在主轴上的基准长度6.2 伸缩项目的放大6.3 伸缩项目的缩小 7. …

网络工程师:计算机基础知识面试题(二)

53.在可变分区管理中&#xff0c;需要哪些硬件机制&#xff1f; 在可变分区管理&#xff08;Variable Partitioning&#xff09;中&#xff0c;需要以下硬件机制&#xff1a; 1. 内存管理单元&#xff08;Memory Management Unit&#xff0c;MMU&#xff09;&#xff1a; MMU…

2024年3d云渲染怎么选?怎么挑好的云渲染农场

3D渲染属于最消耗电脑计算算力过程&#xff0c;并且渲染时间相对于效果图渲染比较久&#xff0c;不少的CG创作者都是通过网络上的“云渲染”平台来完成&#xff0c;提升效率的同时&#xff0c;还可降低渲染的成本。那么好的3D云渲染平台怎么选择呢?在选择时关注哪几个要点呢?…

多角度展文明风采!成都市第二届公益短视频大赛落幕

近日&#xff0c;“金芙蓉文明让生活更美好”成都市第二届公益短视频大赛揭晓获奖名单&#xff0c;170余部作品脱颖而出。此次大赛共收到700余部参赛作品&#xff0c;以不同手法、从不同角度描绘文明成都。 用短视频弘扬社会主义核心价值观 以真实故事为原型引发更多人共鸣 …

中级职称通过率是否高?

中级职称的通过率因地区和行业而异 首先&#xff0c;中级职称的通过率因不同的地区和行业而异。在一些行业和地区&#xff0c;中级职称的通过率可能较高&#xff0c;例如一些技术领域的职称&#xff0c;而在其他行业和地区&#xff0c;通过率可能较低。一般来说&#xff0c;技术…

Vue 3 中的响应式原理

Vue 3是Vue.js的最新版本&#xff0c;它引入了新的Composition API&#xff0c;并带来了一些重要的改进和优化。其中&#xff0c;响应式原理是Vue框架的核心机制之一&#xff0c;它使得当数据发生变化时&#xff0c;视图能够自动更新。在Vue 3中&#xff0c;响应式原理的实现细…

Java异常处理--异常处理的方式1:try-catch-finally

文章目录 一、异常处理概述二、方式1&#xff1a;捕获异常&#xff08;try-catch-finally&#xff09;&#xff08;1&#xff09;抓抛模型&#xff08;2&#xff09;try-catch-finally基本格式1、基本语法2、整体执行过程3、try和catch3.1 try3.2 catch (Exceptiontype e) &…

Linux系统——管道命令tr、cut、sort、uniq命令

一、tr 1.替换 表示将1替换为a 2.删除 tr -d 3.压缩 tr -t 二、cut -d 指定分隔符 -f 指定需要的列 1.提取所需要的列 2.延伸——磁盘剩余空间不足发起警告 可以制定一个计划任务 每30分钟提醒自己磁盘剩余空间情况 三、sort -t 指定分隔符 -k 指定列排序 四、uniq…

前端笔试题(一)

1.vue如何实现数据的双向绑定 利用v-model来实现双向数据绑定 通过Object.defineProperty()来劫持各个属性的setter&#xff0c;getter&#xff0c;在数据变动时发布消息给订阅者&#xff0c;触发相应的监听回调来渲染视图 2.使用vue渲染大量数据时&#xff0c;如何进行优化…

Java重写ArrayList方法

前言&#xff1a;ArrayList中有很多方法&#xff0c;我们只有深知这些方法是怎么实现的才能更好的使用&#xff0c;不用死记硬背 我们来一一实现&#xff08;重写&#xff09; 前提准备&#xff1a;我们需要先创建一个类&#xff0c;类中写ArrayList的内部结构组成 public cl…

82. 删除排序链表中的重复元素 II

给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5]示例 2&#xff1a; 输入&#xff1a;head [1,1,1,2…

Linux常用功能

Linux是一个功能强大的操作系统&#xff0c;具有许多常用功能。以下是一些Linux的常用功能&#xff1a; 命令行界面&#xff1a;Linux的命令行界面是用户与操作系统交互的主要方式。用户可以通过输入命令来执行各种操作&#xff0c;例如文件管理、系统管理、软件安装等。包管理…

代码随想录算法训练营第五天|哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和

系列文章目录 代码随想录算法训练营第一天|数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…

【Elsevier】中科院分区升至1区TOP,录用率50%, 代表作神刊!

发表说 截图来源&#xff1a;LetPub 01 期刊概况 Computers & Industrial Engineering 【出版社】Elsevier 【ISSN】0360-8352 【检索情况】SCI&EI双检 【WOS收录年份】1976年 【出刊频率】月刊&#xff0c;最新一期Volume 188 &#xff0c;In progress (February…

arcgis javascript api4.x以basetilelayer方式加载arcgis发布的栅格切片服务

需求&#xff1a; 以arcgis js api的basetilelayer加载arcgis发布的栅格切片服务 效果图&#xff1a; 其中和tileinfo和lods&#xff0c;这样获取&#xff1a; https://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer/?fpjson urltemplate&#xff1a; …

TortoiseGit 2.15.0.0 安装与配置(图文详细教程)

TortoiseGit的安装与配置 TortoiseGit是Tortoise为Git提供的版本可视化工具&#xff0c;简化了记忆Git命令行的过程&#xff0c;将命令行可视化。 确保自己电脑中已经下载好了git 官网下载TortoiseGit Download – TortoiseGit – Windows Shell Interface to Git 选择64-bi…

电商平台api接口对接须知

随着互联网的发展和普及&#xff0c;电商平台已成为人们日常生活中不可或缺的一部分。而为了保证电商平台的正常运行&#xff0c;平台与开发者之间需要进行数据交互&#xff0c;这便涉及到了电商平台API接口对接的问题。本文将详细介绍电商平台API接口对接的须知事项。 一、了…

【Linux】如何检查Linux用户是否具有sudo权限

问题背景或前提知识 在Linux系统中&#xff0c;sudo&#xff08;superuser do&#xff09;是一个重要的命令&#xff0c;它允许普通用户以系统管理员的身份执行命令。了解用户是否拥有sudo权限对于系统管理和安全性来说是非常重要的。 技术名词解释 sudo&#xff1a;一种程序…