多线程读写文件问题

多线程读写同个文件会不会有访问冲突或者异常?我们写个程序来测试一下

/*** Created by fangruibin* 测试多线程读写文件*/#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string.h>const char* fileName = "test.txt";void processRead()
{FILE* fp = fopen(fileName, "r");if (fp == NULL){printf("open file for read failed\n");return;}// 获取文件长度long startPos = ftell(fp);fseek(fp, 0, SEEK_END);long endPos = ftell(fp);long fileSize = endPos - startPos;fseek(fp, 0, SEEK_SET);char* pBuf = (char*)malloc(fileSize + 1);size_t readSize = fread(pBuf, 1, fileSize, fp);if ((long)readSize != fileSize){printf("read not complete %ld\n", (long)readSize);}pBuf[fileSize] = '\0';if (strlen(pBuf) == 0){printf("read empty\n");}printf("read:\n%s\n", pBuf);free(pBuf);fclose(fp);
}void processWrite()
{FILE* fp = fopen(fileName, "w");if (fp == NULL){printf("open file for write failed\n");return;}const char* pData = "2222222222222222222222222222\n2222222222222222222222222222\n2222222222222222222222222222\n";size_t dataLen = strlen(pData);size_t writeLen = fwrite(pData, 1, dataLen, fp);if (dataLen != writeLen){printf("write not complete %ld\n", (long)writeLen);}fclose(fp);
}void processReadWrite(const char* pData)
{FILE* fp = fopen(fileName, "w+");if (fp == NULL){printf("open file for read&write failed\n");return;}size_t dataLen = strlen(pData);size_t writeLen = fwrite(pData, 1, dataLen, fp);if (dataLen != writeLen){printf("write not complete %ld\n", (long)writeLen);}// 获取文件长度fseek(fp, 0, SEEK_SET);long startPos = ftell(fp);fseek(fp, 0, SEEK_END);long endPos = ftell(fp);long fileSize = endPos - startPos;fseek(fp, 0, SEEK_SET);char* pBuf = (char*)malloc(fileSize + 1);size_t readSize = fread(pBuf, 1, fileSize, fp);if ((long)readSize != fileSize){printf("read not complete %ld\n", (long)readSize);}pBuf[fileSize] = '\0';printf("[rw] read:\n%s\n", pBuf);free(pBuf);fclose(fp);
}//线程1
void* threadFunc1(void* p)
{while (1){// const char* pData = "111111111111111111111111111\n111111111111111111111111111\n";// processReadWrite(pData);processRead();usleep(100 * 1000);}return NULL;
}//线程2
void* threadFunc2(void* p)
{while (1){// const char* pData = "222222222222222222222222222\n222222222222222222222222222\n";// processReadWrite(pData);processWrite();usleep(100 * 1000);}return NULL;
}int main()
{//初始化线程pthread_t hThread1;pthread_t hThread2;if (pthread_create(&hThread1, NULL, &threadFunc1, NULL) != 0){printf("create thread 1 failed\n");return -1;}if (pthread_create(&hThread2, NULL, &threadFunc2, NULL) != 0){printf("create thread 2 failed\n");return -1;}while (1){sleep(1);}return 0;
}

代码中我们设计了两个线程,第一个线程从test.txt文件中读内容,第二个线程不断地向test.txt文件写入内容,然后我们看看读出来的内容和我们写入的内容是不是一样的

运行结果:

fang@fang-deepin:~/dev/chrifang/test/cpp/file$ ./multi_thread 
read:
2222222222222222222222222222
2222222222222222222222222222
2222222222222222222222222222read not complete 0
read empty
read:read not complete 0
read empty
read:read not complete 0
read empty
read:read empty
read:read not complete 0
read empty
read:read not complete 0
read empty
read:read empty
read:read:
2222222222222222222222222222
2222222222222222222222222222
2222222222222222222222222222

可以看到有很多读取结果为空的,证明多线程读写文件是会有访问冲突的。如何避免冲突呢?

1) 同个进程内读写文件加上线程锁

2) 不同进程读写文件使用flock()函数去加锁

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

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

相关文章

【C语言】字符串函数介绍

目录 前言&#xff1a; 1. strlen 函数 函数介绍 strlen 函数的使用 strlen 函数的模拟实现 2. strcpy 函数 函数介绍 strcpy 函数的使用 strcpy 函数的模拟实现 3. strcat 函数 函数介绍 strcat 函数的使用 strcat 函数的模拟实现 4. strcmp 函数 函数介绍 st…

前端工程化之:webpack1-12(常用扩展)

目录 前言 一、CleanWebpackPlugin 二、HtmlWebpackPlugin 三、CopyPlugin 四、webpack-dev-server 五 、file-loader 六、url-loader 七、路径问题 前言 由于 webpack 、 webpack-cli 、 webpack-dev-server 会存在版本不兼容问题&#xff0c;所以这里使用的版本如下&…

4K Video Downloader forMac/win:畅享高清视频下载的终极利器!

在如今的数字时代&#xff0c;高清视频已经成为人们生活中不可或缺的一部分。无论是观看精彩的电影、音乐视频&#xff0c;还是学习教育类的在线课程&#xff0c;我们都希望能够以最清晰流畅的方式来欣赏。而为了满足这一需求&#xff0c;我们需要一款功能强大的高清视频下载软…

工业平板电脑定制_三防平板电脑安卓主板厂家

工业平板电脑具有IP68级三防品质&#xff0c;采用高强度工业材质制造&#xff0c;结构稳固坚韧&#xff0c;具备较高的抗冲击和防震能力。隔空减震技术进一步加强了产品的抗冲击和防震动功能。广泛应用于工控、医疗、电信、电力、工业自动化设备、汽车检测、制造业等多个领域&a…

Flink实时数仓同步:快照表实战详解

一、背景 在大数据领域&#xff0c;初始阶段业务数据通常被存储于关系型数据库&#xff0c;如MySQL。然而&#xff0c;为满足日常分析和报表等需求&#xff0c;大数据平台采用多种同步方式&#xff0c;以适应这些业务数据的不同存储需求。这些同步存储方式包括离线仓库和实时仓…

MySQL语句 |条件语句 IFNULL 和 COALESCE 的区别

在MySQL中&#xff0c;IFNULL和COALESCE都是用来处理NULL值的函数&#xff0c;但它们之间存在一些重要的差异。 函数定义 IFNULL(expr1, expr2): 如果expr1为NULL&#xff0c;则返回expr2&#xff0c;否则返回expr1。COALESCE(value1, value2, ..., valueN): 返回参数列表中的…

机器人中的数值优化进阶|【三】三次样条曲线推导(下)

机器人中的数值优化进阶|【三】三次样条曲线推导&#xff08;下&#xff09; 接之前的内容&#xff0c;现在开始考虑势场函数 P ( η 1 , . . . , η n − 1 ) 1000 ∑ i 1 n − 1 ∑ j 0 m max ⁡ ( r j − ∣ ∣ η i − o j ∣ ∣ , 0 ) P(\eta_1,...,\eta_{n-1}) 100…

C语言入门到精通之练习35:打印出杨辉三角形(要求打印出10行)

题目&#xff1a;打印出杨辉三角形&#xff08;要求打印出10行&#xff09;。 程序分析&#xff1a; 结构如下图所示&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1代码如下&#xff1a; // Created by www.erdangjiade.com 15/11/9. //#incl…

学习方法分享

工作上的代码实现&#xff0c;不要过度设计&#xff0c;不要想着炫技&#xff0c;要简单务实&#xff0c;“大道至简”。 学习一个方向&#xff08;模块化&#xff09;的知识&#xff0c;不经意间就会涉及到另一个领域&#xff0c;比如从消息队列存储的顺序读/写&#xff0c;延…

计算机网络作业答案(ip地址划分,滑动窗口,距离向量算法)

做一个计算机网络作业答案的存档 6.某单位申请到了一个B类IP地址&#xff0c;其网络标识为130.53&#xff0c;现进行子网划分&#xff0c;若选用的子网掩码为 255.255.224.0&#xff0c;请问:(1&#xff09;可划分为多少个子网?(2)每个子网中的主机数最多为多少台?(3&#…

MySQL数据库入门

MySQL数据库概述 1&#xff0c;为什么要使用数据库2&#xff0c;数据库的相关概念3&#xff0c;常见的数据库管理系统4&#xff0c;MySQL介绍5&#xff0c;关系型数据库和非关系型数据库6&#xff0c;关系型数据库的设计规则7&#xff0c;表的关联关系7.1&#xff0c;一对一7.2…

ubuntu server 22.04.3 配置 wifi

1. 配置 wifi 1.1. 查看系统中的网卡 ls /sys/class/net/ $ ls /sys/class/net/ enp1s0 lo wlo1 1.2. 配置 wifi 1.2.1 一个普通的配置 加入我们的机器可能会链接多个网络中的某一个&#xff1a; 网络热点1&#xff1a;ChinaNet-zNpQ password: 12345…

面试高频知识点:2线程 2.1.4 线程池常用参数

1. 核心池大小&#xff08;Core Pool Size&#xff09; 核心池大小是线程池中始终保持存活的线程数量。当有新的任务提交时&#xff0c;线程池会优先使用核心池中的线程来处理任务。这个参数的合理设置直接影响着线程池的性能。如果设置太小&#xff0c;可能导致无法及时处理任…

短剧小程序开发:打造高效、便捷的娱乐体验

随着移动互联网的普及和用户需求的多样化&#xff0c;短剧小程序作为一种新型的应用形态&#xff0c;逐渐受到了广大用户的青睐。短剧小程序开发旨在为用户提供一种高效、便捷的娱乐体验&#xff0c;让用户在忙碌的生活中轻松享受到精彩的短剧内容。本文将探讨短剧小程序开发的…

0203-2-输入输出系统

第六章&#xff1a;输入输出系统 I/O系统的功能&#xff0c;模型和接口 I/O系统管理的对象是I/O设备和相应的设备控制器。 I/O系统的基本功能 隐藏物理设备的细节与设备的无关性提高处理机和I/O设备的利用率对I/O设备进行控制确保对设备的正确共享错误处理 I/O软件的层次结…

Vite与Webpack打包内存溢出问题优雅处理方式

Vite与Webpack打包内存溢出问题处理 文章目录 Vite与Webpack打包内存溢出问题处理1. Vite1. 打包错误提示2. 命令行方式解决3. 配置环境变量方式解决1. 设置变量2. 配置系统的环境变量 2. Webpack1. 打包错误提示2. 命令行方式解决3. 配置环境变量方式解决1. 设置变量2. 配置系…

【DDD】学习笔记-什么是模型

从领域驱动的战略设计进入战术设计&#xff0c;简单说来&#xff0c;就是跨过系统视角的限界上下文边界进入它的内部&#xff0c;从分层架构的逻辑分层进入到每一层的内部。在思考内部的设计细节时&#xff0c;首先需要思考的问题就是&#xff1a;什么是模型&#xff08;Model&…

NETX90-多协议通讯芯片

随着作为信息物理系统核心技术的工业物联网的发展&#xff0c;Hilscher 基于 netX 51/52成功开发了新一代网络控制器netX90&#xff0c;其安全性是产品的核心价值。可实现更高性能的集成&#xff0c;并提高功率效率等级&#xff0c;凭借其较小的外形尺寸能够满足规格尺寸更小的…

C++ 实现单例模式

单例模式 单例模式确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 创建单一实例 怎么让某个类只能创建一个实例&#xff1f; 思路&#xff1a;将类的构造函数私有&#xff0c;然后提供一个静态方法访问对象。调用类内成员函数需要对象&#xff0c;但我们又无法…