【问题标题】:Are Interlocked* functions useful on shared memory?Interlocked* 函数对共享内存有用吗?
【发布时间】:2010-12-10 21:33:25
【问题描述】:

两个 Windows 进程的内存映射了同一个共享文件。如果文件包含计数器,是否适合使用Interlocked* 函数(如InterlockedIncrement)来更新这些计数器?那些会跨进程同步访问吗?还是我需要使用更重的东西,比如互斥体?或者也许共享内存机制本身可以确保一致的视图。

【问题讨论】:

    标签: winapi ipc shared-memory interlocked


    【解决方案1】:

    联锁功能正是为这种类型的使用而设计的。

    来自http://msdn.microsoft.com/en-us/library/ms684122.aspx

    如果变量在共享内存中,不同进程的线程可以使用这些函数。

    当然,如果您需要以原子方式更新多个项目,则需要使用互斥锁或其他跨进程工作的同步对象。共享内存机制没有内置任何内容来提供对共享内存的访问同步 - 您需要使用互锁函数或同步对象。

    【讨论】:

    • 但是 InterlockedIncrement 是否可以跨进程工作?我认为这是相关的问题——据我所知,事实并非如此。
    • 来自msdn.microsoft.com/en-us/library/ms683614.aspx:“该函数生成一个完整的内存屏障(或栅栏),以确保内存操作按顺序完成。”
    • 只要内存映射到同一个物理地址,Interlocked就可以了。它可以确保所有处理器的内存总线都被锁定,并且它们的缓存对于给定地址是一致的,与进程无关。
    • 我想我不清楚的是文件映射是否总是导致内存被映射到相同的物理地址,或者操作系统是否复制数据以使其看起来如此。对于所有层(虚拟地址、视图、映射、物理地址和文件),我一直不清楚合并点在哪里。仅当您使用相同(或重复的)映射句柄时,MSDN 中的共享内存部分才能保证一致性。
    • 在后台,您将使用的存储在共享内存中的任何互斥锁都在使用与 Interlocked* 相同的内存栅栏和锁定指令。
    【解决方案2】:

    来自MSDN

    ...

    联锁 API

    联锁功能提供了一个 简单的同步机制 访问共享的变量 多个线程。他们还表演 原子变量的操作 方式。不同的线程 进程可以使用这些函数,如果 变量在共享内存中。

    所以,是的,您的共享内存方法是安全的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      相关资源
      最近更新 更多