【问题标题】:CreateFileMapping and MapViewOfFile with interprocess (un)synchronized multithreaded access?具有进程间(非)同步多线程访问的 CreateFileMapping 和 MapViewOfFile?
【发布时间】:2013-05-04 23:35:16
【问题描述】:

我使用共享内存区域将 som 数据获取到第二个进程。

第一个进程使用CreateFileMapping(INVALID_HANDLE_VALUE, ..., PAGE_READWRITE, ...)MapViewOfFile( ... FILE_MAP_WRITE)

第二个进程使用OpenFileMapping(FILE_MAP_WRITE, ...)MapViewOfFile( ... FILE_MAP_WRITE)

docs 状态:

文件映射对象的多个视图 如果它们在指定时间包含相同的数据,则它们是一致的。 如果文件视图派生自任何文件映射对象,则会发生这种情况 由同一个文件支持。 (...)

除了一个重要的例外,从任何文件映射派生的文件视图 由同一文件支持的对象在某一点上是连贯的或相同的 特定的时间。保证流程内视图的一致性,并且 对于由不同进程映射的视图。

异常与远程文件有关。 (...)

由于我只是按原样使用共享内存(由分页文件支持),我会假设进程之间需要一些同步才能看到另一个进程写入的内存的一致视图。但是我不确定到底需要什么同步。

我目前的模式(简化)是这样的:

Process1                    |  Process2
...                         |  ...
/* write to shared mem, */  |  ::WaitForSingleObject(hDataReady); // real code has error handling
/* then: */
::SetEvent(hDataReady);     |  /* read from shared mem after wait returns */
...                         |  ...

即使对于共享内存,这是否足够同步?

两个进程之间一般需要什么同步?

请注意,在单个进程内,对SetEvent 的调用肯定会构成full memory barrier,但我并不完全清楚这是否适用于跨进程的共享内存。

【问题讨论】:

  • 文件映射只是获得了2个进程可见的内存区域。由于您在 Windows 上运行 x86 / x64,并且 CPU 具有总存储内存顺序,我认为您在此处显示的内容应该可以。
  • 您有很多未解决的问题。如果您在这里获得的帮助不适合您,那么使用本网站就没有多大意义。
  • @HansPassant:“开放”是指您认为我的一些问题您认为我应该标记为已回答?

标签: winapi visual-c++ shared-memory memory-barriers file-mapping


【解决方案1】:

我已经相信出于内存访问同步的目的,并发访问的内存是在进程之间共享还是仅由一个进程共享实际上并不重要线程之间。

也就是说,对于 Windows 上的共享内存(进程之间共享的内存),与进程中的“正常”内存相同的限制和准则适用于仅在进程线程之间共享的进程。

我认为这是因为进程和线程在 Windows 上有些正交。进程是线程的“容器”,为了让进程能够做任何事情,它至少需要一个线程。因此,对于映射到多个进程地址空间的内存,这些不同进程中运行的线程的同步要求实际上应该与同一进程中运行的线程相同。

那么,我的问题的答案这是否足够同步,即使对于共享内存也是如此?是共享内存需要与“普通”内存相同的同步。但是,当然,并非所有同步技术都可以跨进程边界工作,因此您可以使用的内容受到限制。 (例如,Critical Section 不能跨进程使用。)

【讨论】:

    【解决方案2】:

    如果这两个代码 sn-ps 都在循环中,那么除了事件之外,您还需要一个互斥锁,以便 Process1 在 Process2 仍在读取时不会再次开始写入。更具体地说,必须在读取或写入之前获取互斥锁,并在读取或写入之后释放。在 Process2 中调用 WFSO 之前,请确保 mutex 已释放。

    【讨论】:

      【解决方案3】:

      我的理解是,虽然 Windows 可以保证视图的一致性,但它并不能保证在客户端读取之前写入完全完成。

      例如,如果您正在编写“Hello world!”到视图中,只能在客户端读取时部分写入,如“Hello w”。

      因此,视图将是 byte 连贯的,但不是 message 连贯的。

      就我个人而言,我使用互斥锁来保证线程安全访问。

      【讨论】:

        【解决方案4】:

        Use Semaphore 应该比 Event 更好。

        【讨论】:

        • 这个答案可能需要一些解释。
        猜你喜欢
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-26
        相关资源
        最近更新 更多