当我实现 DBMS 的磁盘管理组件时,是否可以在 C++ 中使用 fstream 来读取或写入文件

Can I use fstream in C++ to read or write file when I'm implementing a disk management component of DBMS

本文关键字:fstream C++ 读取 文件 磁盘 DBMS 实现 管理 组件 是否      更新时间:2023-10-16

在C++中,我知道我可以使用读取或写入系统功能(如读取或写入)来读取或写入文件,也可以在fstream的帮助下做到这一点。

现在我正在实现一个磁盘管理,它是DBMS的一个组件。为简单起见,我只使用磁盘管理来管理 Unix 文件的空间。

我所知道的是 fstream 包装系统功能,如读取或写入并提供一些缓冲区。但是我想知道这是否会影响原子性和同步性?

我的问题是我应该使用哪种方式,为什么?

No.特别是不是Unix。DBM 将需要连续的文件。这意味着要么是支持它们的 unix 变体,要么是创建磁盘分区。

您还需要处理缓冲;而不是遵循C++库的缓冲。

我可以继续说下去,但流是针对数据流的,而不是安全可靠的结构化数据。

以下有关"fstream"的同步和线程安全的信息可以从ISO C++标准中找到。

27.2.3 线程安全 [iostreams.threadsafety]

并发访问流对象(27.8、27.9)、流缓冲区 对象 (27.6) 或 C 库流 (27.9.2) 可能由多个线程 除非另有说明,否则会导致数据争用 (1.10) (27.4)。[ 注意:数据争用会导致未定义的行为 (1.10)。—尾注 ]

如果一个线程使库调用将值写入流 结果,另一个线程从流中读取此值 通过库调用 b,这样这不会导致数据 比赛,然后 A 的写入与 B 的读取同步。

默认情况下,C/C++文件 I/O 操作不是线程安全的。因此,如果您计划使用打开/写入/读取系统调用的 fstream,那么您必须在实现中自己使用同步机制。您可以使用新C++标准(.i.e C++11)中提供的"std::mutex"机制来同步文件I/O。