提升时冲洗::mapped_region多余

flush on boost::mapped_region superfluous?

本文关键字:mapped region 多余      更新时间:2023-10-16

我正在尝试使用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()确保它发生,但它可能已经完成了。