【问题标题】:Are memory-mapped files thread safe内存映射文件是线程安全的吗
【发布时间】: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


【解决方案1】:

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

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

您需要确保线程协调它们的更改,以便没有线程访问不一致的视图(例如,所有访问都通过临界区)。

【讨论】:

  • 实际上,我想知道的是,在写入非重叠位置的情况下,取消临界区是否安全。
  • @Vlad 我在这里尝试通用,锁不是协调访问以避免不一致视图的唯一方法,不同的线程访问内存的不同部分也可以通过不共享来实现这一点(这是最高性能的共享类型)。请注意,我将关键部分作为 示例
【解决方案2】:

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

【讨论】:

  • 这里 MMF 的潜在用例,假设它是线程安全的,将简化从多线程代码写入单个文件,允许操作系统处理实际保存数据适当时将 VM 写入磁盘。
  • 它负责写作,而不是线程安全。只有当您不按顺序写入而是重复写入同一文件部分时,MMF 才会在这种情况下有用。
  • 汉斯,肯定不需要同步,因为不同的线程正在访问地址空间的不同部分?
  • @Harry,让一个线程只写是没有意义的。应该有人阅读,否则只是浪费时间。读取需要与写入同步。至少这是共享内存的传统用法。
  • @Hans,他正在使用内存映射作为写入文件的一种方式。每个线程都在访问地址空间的不相交段。在这种情况下,不需要同步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2011-03-14
  • 2020-08-26
相关资源
最近更新 更多