【发布时间】:2011-12-23 13:12:22
【问题描述】:
我想知道您是否可以使用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;
}
如果我要运行它,等待线程完成,取消映射文件并退出,我最终会得到一个包含连续整数的文件吗?
我将不胜感激。
【问题讨论】:
-
“只有一组数据,所以所有的观点总是相互一致的”这句话是规范的。 “这意味着……”这句话是解释性的。解释性陈述帮助您理解规范性文本;他们不替换它。一台机器上的所有视图总是相互一致的,无论它们是否在同一个进程中。但是如果你的线程在同一个进程中,为什么要创建两个视图呢?为什么不在他们之间分享相同的观点?
-
我不反对在线程之间共享视图,老实说,我认为我会这样做。但我想确保我没有遗漏任何东西。
-
弗拉德,您知道您可以使用带有异步文件句柄的 WriteFile 或 WriteFileEx 从多个线程同时写入文件的不同部分吗?您不需要使用内存映射来实现这一点(尽管内存映射也可以)。
-
@Harry 我不知道,但很高兴知道这是允许的。
标签: windows multithreading memory thread-safety shared-memory