ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

APUE---chap3文件I/O---原子操作

2022-01-25 12:04:49  阅读:112  来源: 互联网

标签:文件 多线程 APUE lseek 写入 --- chap3 fd include


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

  • 考虑下面这种情况,单进程去读写文件没有什么问题
#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,lseek,写入,---,chap3,fd,include
来源: https://blog.csdn.net/m0_37844072/article/details/122682066

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有