我想知道您是否可以使用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;
}
如果我要运行它,等待线程完成,取消映射文件并退出,我最终会得到一个包含连续整数的文件吗?
我很感激能够得到明智的回答。
答案 0 :(得分:4)
无论是从一个进程内的多个进程还是多个线程访问MMF视图,都需要添加同步。 Fwiw,在一个进程中使用MMF进行内存共享没有任何意义。线程已经共享地址空间。
答案 1 :(得分:2)
但它是否适用于属于同一进程的线程?
是。如果一个线程更改了映射中的部分数据,那么所有其他线程会立即看到该更改。
您需要确保线程协调其更改,以便没有线程访问不一致的视图(例如,所有访问都是通过关键部分)。