内存映射文件是否安全

时间:2011-11-07 11:07:33

标签: windows multithreading memory thread-safety shared-memory

我想知道您是否可以使用memory-mapped files对单个文件执行多线程写入,并确保两个线程不会写入同一区域(例如,通过交错固定大小的记录),从而减轻需要在应用程序级别进行同步,即不在代码中使用关键部分或互斥锁。

然而,谷歌搜索了一下之后,我仍然不确定。微软的这个link说:

  

首先,由于这两个过程都明显节省了资源   共享内存的物理页面和硬盘页面   存储用于支持内存映射文件。其次,只有一个   数据集,因此所有视图始终彼此一致。这个   表示通过一个对内存映射文件中的页面所做的更改   进程的视图自动反映在一个公共视图中   另一个进程中的内存映射文件。从本质上讲,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;
}

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

我很感激能够得到明智的回答。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

  

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

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

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