gpt4 book ai didi

c - 读取文件的线程安全

转载 作者:太空宇宙 更新时间:2023-11-04 11:42:54 25 4
gpt4 key购买 nike

所以我的最终目标是让多个线程从头到尾读取同一个文件。例如,如果文件是 200 字节:

Thread A  0-> 200 bytes
Thread B 0-> 200 bytes
Thread C 0-> 200 bytes

等等

基本上让每个线程读取整个文件。该软件只读取该文件,不写入。

所以我打开文件:

fd = open(filename, O_RDWR|O_SYNC, 0);

然后在每个线程中简单地循环文件。因为我只创建一个文件描述符,所以也在每个线程中使用 dup 创建一个文件描述符的克隆

这是一个线程函数的最小示例:

void ThreadFunction(){
int file_desc= dup(fd);
uint32_t nReadBuffer[1000];
int numBytes = -1;
while (numBytes != 0) {
numBytes = read(file_desc, &nReadBuffer, sizeof(nReadBuffer));
//processing on the bytes goes here
}
}

但是,我不确定这是否正确地遍历了整个文件,而是每个线程都以某种方式菊花链遍历了文件。

这种方法是否正确?我为我正在从事的项目继承了这个软件,文件描述符在 mmap 调用中使用,所以我不完全确定 O_RDWR 或 O_SYNC 问题

最佳答案

正如其他人所提到的,这里不可能使用重复的文件描述符。但是,有一个线程安全的替代方法,即使用 preadpread 在偏移量处读取文件并且不更改文件描述中的隐式偏移量。

这确实意味着您必须手动管理每个线程中的偏移量,但这对于您提议的函数来说应该不是什么大问题。

关于c - 读取文件的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58738025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com