一. 多线程带来的文件读写问题

  • 考虑下面这种情况,单进程去读写文件没有什么问题
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include "stdio.h"int main() {int fd = open("Person.cpp", O_RDWR);if (lseek(fd, 0L, 2) < 0) // 定位到文件末尾perror("lseek error");char buff[10] = {'1', '1', '1', '1', '1', '1', '1', '1', '1', '1',};if (write(fd, buff, 10) != 10) //写入buff的数据perror("write error");
}

如果我们有两个进程同时对这个文件进行写入。A进程使用lseek对文件末尾字节进行写入,B进程也使用lseek对文件末尾进行写入。本来AB进程的目的都是想在文件的尾端进行写入,如果此时某个进程先执行,那么文件的内容增加,另外一个内容再去写入时就不会在尾端写入了,而是插入。这就是多线程带来的问题。

  • 所以关键的问题是:我们希望某个线程去写,保存文件是一个不可以被其他线程打断的操作。就是说希望A线程打开-->写-->完成,这三个动作是一起的不会被打断的动作。

二. 原子操作(atomic operation)

概念:原子操作指的是不会被多线程打断的一个最小操作集合。

比如对某一段代码加锁,那么lock()与unlock()之间的代码就不会被其他线程打断。

三. 用pread()/pwrite()解决多线程的读写问题

pread()和pwrite()就是原子函数,不用考虑“一”中出现的多线程读写一个问题带来的问题。

#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset);ssize_t pwrite(int fd, const void *buf, size_t nbytes, off_t offset);

用法和read/write差不多,不过需要其他的参数。

APUE---chap3文件I/O---3.11原子操作相关推荐

  1. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  2. UNIX 环境高级编程(一) apue.h 文件与apue.3e的安装

    apue:Advanced Programming in the UNIX Environment, 本文关注第三版(3e) 1. apue.3e 的安装 APUE.3e 安装(基于ubuntu12. ...

  3. c++ 11 原子操作库 (std::atomic)(一)

    定义于头文件 <atomic> atomic 类模板及其针对布尔.整型和指针类型的特化 template< class T >    struct atomic; (1) (C ...

  4. c++ 11 原子操作库 (std::atomic)(二)

    定义于头文件 <atomic> atomic 类模板及其针对布尔.整型和指针类型的特化 每个 std::atomic 模板的实例化和全特化定义一个原子类型.若一个线程写入原子对象,同时另一 ...

  5. linux下.rar的文件,Linux下.rar压缩文件处理 (RAR 4.11 for linux )

    环境:centos 6.2 download :RAR 4.11 for linux : http://www.rarsoft.com/download.htm 本博客内容均为自己在linux学习路上 ...

  6. 【APUE】文件 I/O 操作

    博客地址 : http://blog.csdn.net/shulianghan/article/details/46980271 一. 文件打开关闭操作相关函数介绍 1. open 函数 (1) op ...

  7. jdk8读取文件_用于从文件读取/写入文件的新JDK 11文件方法

    jdk8读取文件 我之前的文章重点讨论了可能添加到JDK 11中的Files.isSameContent()方法. JDK-8201276 ["(fs)向文件添加方法以从文件读取字符串或向文 ...

  8. jdk12源代码文件_在JDK 11中启动单文件源代码程序

    jdk12源代码文件 JEP 330 –启动单文件源代码程序是即将发布的JDK 11(18.9)发行版中令人兴奋的功能之一. 此功能允许直接使用java解释器执行Java源代码. 源代码在内存中编译, ...

  9. C Primer Plus 第13章 文件输入/输出 13.11 编程练习答案

    2019独角兽企业重金招聘Python工程师标准>>> 1.修改程序清单13.1中的程序,使之不采用命令行参数,而是请求用户输入文件名并读入用户的响应. (程序清单13.1示范了如何 ...

  10. bigsur cdr文件_macOS Big Sur 11.2 原版引导镜像下载

    大瑟尔: macOS Big Sur 将强大实力和优美外观的结合提升到一个崭新的高度.精心雕琢的全新设计,让你能淋漓尽致地感受 Mac 的魅力:Safari 浏览器迎来重大更新,待你饱览:地图 app ...

最新文章

  1. 除了不要 SELECT * ,数据库还有哪些技巧
  2. 皮一皮:顶尖黑客技术,10秒教学,不会你打我!
  3. 循环调用dll库的界面时,首次正常,再次无响应
  4. 大数据实训报告_教学大数据实训平台解决方案_德拓信息_上海市徐汇区
  5. 蚂蚁金服高级技术专家徐红星 :蚂蚁金服大数据开放式创新实践
  6. 服务机器人---充电桩
  7. linux下如何使用有道词典
  8. JavaScript window.location物
  9. wxpython安装_01Python安装教程与特色介绍
  10. 高德JS依赖分析工程及关键原理
  11. Sql根据不同条件统计总数
  12. 米家扫地机器人是石头代工的_石头科技的隐忧:智能扫地机器人前有高山 后有追兵...
  13. 基于matlab的高等数学,基于MATLAB的高等数学问题求解
  14. Sphinx语音识别
  15. 国内国外常用外包平台大全汇总!
  16. hadoop学习之----------IntelliJ IDEA上实现MapReduce中最简单的单词统计的程序(本地 和 hadoop 两种实现方式)...
  17. 十一、TN 的本征自洽方法、梯度更新与任意 TN 的收缩
  18. 对于互联网现状的认知与感悟
  19. spring boot新闻管理系统 毕业设计源码211113
  20. 私人服务器用老旧电脑怎样改

热门文章

  1. Java Jsoup爬虫入门
  2. linux内核编程--1模块的装载和卸载
  3. Spire.Doc 指定位置插入书签和获取书签内容
  4. comps电磁场模拟软件_|Mentor Graphics IE3D(电磁场仿真软件)下载v15.0官方版 - 欧普软件下载...
  5. Mentor Expedition(EE)如何给我们的PCB铺铜?
  6. 【PBRT】圆盘均匀采样,python实现
  7. 解决:AttributeError: ‘str‘ object has no attribute ‘decode‘
  8. 人口logistic模型公式_人口预测模型Matlab实现Logistic曲线模型
  9. C语言 指针访问数组,C语言通过指针引用数组
  10. DolbyAudio访问杜比音效驱动程序时发生问题,请重新启动计算机或......