APUE---chap3文件I/O---3.11原子操作
一. 多线程带来的文件读写问题
- 考虑下面这种情况,单进程去读写文件没有什么问题
#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原子操作相关推荐
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- UNIX 环境高级编程(一) apue.h 文件与apue.3e的安装
apue:Advanced Programming in the UNIX Environment, 本文关注第三版(3e) 1. apue.3e 的安装 APUE.3e 安装(基于ubuntu12. ...
- c++ 11 原子操作库 (std::atomic)(一)
定义于头文件 <atomic> atomic 类模板及其针对布尔.整型和指针类型的特化 template< class T > struct atomic; (1) (C ...
- c++ 11 原子操作库 (std::atomic)(二)
定义于头文件 <atomic> atomic 类模板及其针对布尔.整型和指针类型的特化 每个 std::atomic 模板的实例化和全特化定义一个原子类型.若一个线程写入原子对象,同时另一 ...
- 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学习路上 ...
- 【APUE】文件 I/O 操作
博客地址 : http://blog.csdn.net/shulianghan/article/details/46980271 一. 文件打开关闭操作相关函数介绍 1. open 函数 (1) op ...
- jdk8读取文件_用于从文件读取/写入文件的新JDK 11文件方法
jdk8读取文件 我之前的文章重点讨论了可能添加到JDK 11中的Files.isSameContent()方法. JDK-8201276 ["(fs)向文件添加方法以从文件读取字符串或向文 ...
- jdk12源代码文件_在JDK 11中启动单文件源代码程序
jdk12源代码文件 JEP 330 –启动单文件源代码程序是即将发布的JDK 11(18.9)发行版中令人兴奋的功能之一. 此功能允许直接使用java解释器执行Java源代码. 源代码在内存中编译, ...
- C Primer Plus 第13章 文件输入/输出 13.11 编程练习答案
2019独角兽企业重金招聘Python工程师标准>>> 1.修改程序清单13.1中的程序,使之不采用命令行参数,而是请求用户输入文件名并读入用户的响应. (程序清单13.1示范了如何 ...
- bigsur cdr文件_macOS Big Sur 11.2 原版引导镜像下载
大瑟尔: macOS Big Sur 将强大实力和优美外观的结合提升到一个崭新的高度.精心雕琢的全新设计,让你能淋漓尽致地感受 Mac 的魅力:Safari 浏览器迎来重大更新,待你饱览:地图 app ...
最新文章
- 除了不要 SELECT * ,数据库还有哪些技巧
- 皮一皮:顶尖黑客技术,10秒教学,不会你打我!
- 循环调用dll库的界面时,首次正常,再次无响应
- 大数据实训报告_教学大数据实训平台解决方案_德拓信息_上海市徐汇区
- 蚂蚁金服高级技术专家徐红星 :蚂蚁金服大数据开放式创新实践
- 服务机器人---充电桩
- linux下如何使用有道词典
- JavaScript window.location物
- wxpython安装_01Python安装教程与特色介绍
- 高德JS依赖分析工程及关键原理
- Sql根据不同条件统计总数
- 米家扫地机器人是石头代工的_石头科技的隐忧:智能扫地机器人前有高山 后有追兵...
- 基于matlab的高等数学,基于MATLAB的高等数学问题求解
- Sphinx语音识别
- 国内国外常用外包平台大全汇总!
- hadoop学习之----------IntelliJ IDEA上实现MapReduce中最简单的单词统计的程序(本地 和 hadoop 两种实现方式)...
- 十一、TN 的本征自洽方法、梯度更新与任意 TN 的收缩
- 对于互联网现状的认知与感悟
- spring boot新闻管理系统 毕业设计源码211113
- 私人服务器用老旧电脑怎样改
热门文章
- Java Jsoup爬虫入门
- linux内核编程--1模块的装载和卸载
- Spire.Doc 指定位置插入书签和获取书签内容
- comps电磁场模拟软件_|Mentor Graphics IE3D(电磁场仿真软件)下载v15.0官方版 - 欧普软件下载...
- Mentor Expedition(EE)如何给我们的PCB铺铜?
- 【PBRT】圆盘均匀采样,python实现
- 解决:AttributeError: ‘str‘ object has no attribute ‘decode‘
- 人口logistic模型公式_人口预测模型Matlab实现Logistic曲线模型
- C语言 指针访问数组,C语言通过指针引用数组
- DolbyAudio访问杜比音效驱动程序时发生问题,请重新启动计算机或......