【问题标题】:Sharing GlobalAlloc() memory from DLL to multiple Win32 applications从 DLL 共享 GlobalAlloc() 内存到多个 Win32 应用程序
【发布时间】:2012-01-25 08:40:01
【问题描述】:

我想将我的缓存库移动到 DLL 并允许多个应用程序共享使用 GlobalAlloc() 在 DLL 中分配的单个指针。我怎样才能做到这一点,这会导致性能显着下降吗?

【问题讨论】:

  • 您希望内存在所有使用 DLL 的独立进程之间直接共享吗?堆 API 不会这样做,因为它们分配每个进程的内存。要在进程之间共享内存,您需要使用Shared Memory using the file mapping APIs(不需要实际文件)。请注意,虽然您将在每个进程中获得相同的内存,但内存最终可能位于不同的地址,因此您将拥有不同的指针值。

标签: winapi memory dll


【解决方案1】:

您当然可以这样做,并且不会对单个指针产生任何性能影响。

您应该选择不同的共享堆,而不是使用旧版 API GlobalAlloc。例如,最简单的使用是 COM 分配器,CoTaskMemAlloc。或者你可以使用HeapAlloc传递GetProcessHeap获得的进程堆。

例如,忽略显示错误检查:

void *mem = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);

请注意,如果您希望内存在与其创建位置不同的模块中被释放,您只需要担心堆共享。如果您的 DLL 同时创建和销毁内存,那么您可以使用普通的旧 malloc。因为所有模块都位于相同的进程地址空间中,所以该进程中任何模块分配的内存都可以被任何其他模块使用。

更新

我在第一次阅读该问题时未能了解您可能希望多个进程访问同一内存的可能性。如果这是您所需要的,那么只能使用内存映射文件,或者使用某种形式的 IPC。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多