刷新boost :: mapped_region是多余的?

时间:2014-12-17 10:44:33

标签: c++ boost memory-mapped-files

我正在尝试使用boost :: interprocess :: mapped_regions来快速读/写数据。

我的理解是,一旦映射区域指向内存映射对象(在我的情况下是boost :: interprocess :: file_mapping),只有在刷新mapped_region之后,对mapped_region的任何写入都将反映到实际文件中。

在以下代码段中,我是:

  • 在磁盘上创建一个100 MB的文件,然后填写所有'然后
  • 在磁盘上创建此文件的文件映射
  • 从文件映射创建映射区域,然后
  • 将映射的区域数据修改为全部' 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的内容就变成了所有的&#39; A&#39;第

为什么会这样?

1 个答案:

答案 0 :(得分:2)

在Windows上修改要修改文件的内存时。操作系统保证文件的任何读者都能立即看到您的更改。

数据不会立即写入磁盘;这将是不可能的昂贵。但是,对文件的任何读取都可以从内存中的副本中得到满足。

总的来说,我相信操作系统可以随时刷新到磁盘;显式flush()确保它发生,但它可能已经完成。