gpt4 book ai didi

c++ - 在使用 mmap 读出文件的同时写入文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:23:23 31 4
gpt4 key购买 nike

情况是这样的。

  1. 大量数据缓冲区(应超过合理的 RAMconsumption) 由程序生成。

  2. 该程序同时提供一个 websocket,它允许一个 web客户端指定要查看的此数据缓冲区的一小部分。

为了支持第一个目标,文件是使用标准方法写入的(我使用可移植的 C-stdio fopenfwrite 因为它被证明比各种更快“纯 C++”方法。没关系。数据被附加到文件;stdio 将缓冲写入并定期刷新它们。)

为了支持第二个目标(在 BSD 上,特别是 iOS),打开文件(open from sys/fcntl.h -- notstdio.h 一样可移植)和内存映射(来自 sys/mman.hmmap -- 同上)。通过决定使用内存映射,我不得不放弃此代码的一些可移植性。似乎我可以考虑使用 Boost 来避免重新发明轮子。

无论如何,我的问题是关于我应该如何执行此操作,因为至少有两个线程:主程序线程定期附加到文件,以及响应文件的网络(或工作线程)线程Web 请求并传送从映射到磁盘文件的内存区域读取的数据。

假设文件开始大小为 1024 字节,mmap 被称为初始映射 1024 字节。当主线程将另外 512 字节写入文件时,网络线程如何才能得到通知或知道文件当前实际大小的任何信息(以便它可以 munmapmmap 再次使用与新大小对应的更大缓冲区)?此外,如果我天真地这样做,我会担心主线程报告已写入 512 字节的情况,因此另一个线程现在映射文件的 1536 字节,但实际上并不是所有新的 512 字节都写入磁盘然而(操作系统仍在努力编写它,也许)。现在发生了什么?会不会出现一些垃圾?我的程序会崩溃吗?

如何确定数据何时被正确刷新?如何在数据刷新后及时通知我,以便进行内存映射?

特别是,调用 fflush 是保证文件现在更新 w.r.t. 的唯一方法。流,然后我能否保证(一旦 fflush 返回)内存映射可以访问新大小而不会发生访问冲突? fsync 怎么样?

最佳答案

当你以mmap的形式直接使用POSIX API时,你也应该直接使用它来编写。 POSIX 和 LibC 接口(interface)不能很好地协同工作。

write 是一个将数据直接传输到内核的系统调用。逐字节写入会很慢,但对于写入大缓冲区,它会快一点点,因为它的开销更少(fwrite 最终在后台调用 write反正)。而且 fwrite+fflush 肯定更有效,因为这些可能最终是两次或多次调用 write 并且如果你直接 write,就是一个

mmap 的文档对此不是很清楚,但似乎您不能请求比文件实际拥有的字节更多的字节。

关于c++ - 在使用 mmap 读出文件的同时写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22678981/

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