提升时冲洗::mapped_region多余
flush on boost::mapped_region superfluous?
我正在尝试使用boost::interprocess::mapped_regions快速读取/写入数据。
我的理解是,一旦映射区域指向内存映射对象(在我的例子中是 boost::interprocess::file_mapping(,任何对mapped_region的写入只有在我刷新mapped_region后才会反映到实际文件中。
在下面的代码片段中,我是:
- 在磁盘上创建一个 100 MB 的文件,然后用所有"B"填充它
- 然后在磁盘中的此文件上创建文件映射
- 然后从文件映射创建映射区域
- 然后将映射的区域数据修改为所有"A">
-
刷新映射区域,以便数据反映在实际磁盘上
const size_t SIZE = 1024 * 1024 * 100; const char * PATH = "C:/1.txt"; void CreateFile() { auto ptr = std::unique_ptr<char[]>(new char[SIZE]); memset(ptr.get(), 'B', SIZE); ofstream fs(PATH, ios::binary); fs.write((char *)ptr.get(), SIZE); } int main() { CreateFile(); file_mapping fm(PATH, read_write); mapped_region ms(fm, read_write, 0, SIZE); memset(ms.get_address(), 'A', SIZE); ms.flush(0, SIZE, false); int x = 10; }
理想情况下,只有在我调用 ms.flush(( 之后,更改才应反映在 1.txt 中。但是在调用memset后不久,1.txt的内容变成了所有"A"。
为什么会这样?
在 Windows 上,当您修改内存时,您正在修改文件。操作系统保证文件的任何读取者都会立即看到您的更改。
数据不会立即写入磁盘;那将是非常昂贵的。但是,对文件的任何读取都可以并且已经从内存中的副本中得到满足。
总的来说,我相信操作系统可以随时自由刷新到磁盘;显式flush()
确保它发生,但它可能已经完成了。