我正在尝试使用boost :: interprocess :: mapped_regions来快速读/写数据。
我的理解是,一旦映射区域指向内存映射对象(在我的情况下是boost :: interprocess :: file_mapping),只有在刷新mapped_region之后,对mapped_region的任何写入都将反映到实际文件中。
在以下代码段中,我是:
刷新映射区域,以便数据反映在实际磁盘上
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;第
为什么会这样?
答案 0 :(得分:2)
在Windows上修改要修改文件的内存时。操作系统保证文件的任何读者都能立即看到您的更改。
数据不会立即写入磁盘;这将是不可能的昂贵。但是,对文件的任何读取都可以从内存中的副本中得到满足。
总的来说,我相信操作系统可以随时刷新到磁盘;显式flush()
确保它发生,但它可能已经完成。