日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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原子操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。