内存映射文件是线程安全的

我想知道是否可以通过使用内存映射文件对单个文件执行multithreading写入,并确保两个线程不写入同一区域(例如,通过交错固定大小的logging),从而减less了同步在应用程序级别,即不使用我的代码中的关键部分或互斥体。

但是,经过Google的search,我还是不确定。 来自微软的这个链接说:

首先,资源明显节省,因为两个进程共享内存的物理页面和用于支持内存映射文件的硬盘存储页面。 其次,只有一组数据,所以所有的观点都是一致的。 这意味着通过一个进程的视图对内存映射文件中的页面进行的更改会自动反映到另一个进程的内存映射文件的公共视图中。 本质上,Windows NT不需要做任何特殊的簿记来确保数据对两个应用程序的完整性。

但它是否适用于属于同一进程的线程? 这将是合理的(因为我的写作是不相交的),但是我不太了解内存映射的底层实现(例如,操作系统要做什么)。

示例用例,其中myFunction由每个线程执行:

 // crt - index of current thread, in 0..n-1 // n - thread count // memArea - pointer to memory location obtained from mapping a file void myFunction(int crt, int n, int*memArea){ for (int i=1; i<512; i++) memArea[ ( sizeof(int)*( n*i + crt ) ] = n*i+crt; } 

如果我要运行这个,等待线程完成,取消映射文件并退出,我最终将包含连续整数的文件?

我将不胜感激。

无论MMF视图是从一个进程内的多个进程还是多个线程访问的,您都需要添加同步。 Fwiw,在一个进程中使用MMF进行内存共享没有任何意义。 线程已经共享地址空间。

但它是否适用于属于同一进程的线程?

是。 如果一个线程更改映射中的部分数据,则所有其他线程立即看到该更改。

您需要确保线程协调其更改,以便没有线程访问不一致的视图(例如,所有访问都是通过关键部分)。