【问题标题】:Shared memory in DLLsDLL 中的共享内存
【发布时间】:2011-12-04 01:53:20
【问题描述】:

共享内存在 DLL 中是如何工作的?

当 DLL 附加到进程时,它使用与进程相同的内存地址。假设我们在 DLL 中有以下函数:

int * data = 0;
int foo()
{
    if (!data) data = new int(random());
    return *data;
}

当进程 A 调用此函数时,它会创建新对象 (int) 并返回其值。 但是现在进程 B 附加了这个 DLL。它调用 foo() 但我不明白它是如何工作的,因为 data 正在处理中的内存空间。 B怎么能直接使用呢?

【问题讨论】:

  • 进程间共享内存需要OS API支持,在Windows下可用。

标签: c++ c windows dll


【解决方案1】:

您在这里误解了两个不同的概念 - dll 在这个意义上共享内存,即所有(永远)不会改变的东西都是共享的(物理上)。它节省了您的 RAM,因为 DLL 中的大量数据是代码和其他常量数据,因此无论有多少进程使用它,系统都只使用它的一个副本。这在系统级别很重要 - 从应用程序的角度来看,根本看不到共享。

但是,此处描述的内部数据不会在进程之间共享 - 每个进程都有自己的副本。如果您对在进程之间共享内存感兴趣,则需要其他机制。您可能对Creating Named Shared Memory 感兴趣。

【讨论】:

    【解决方案2】:

    你是对的,默认情况下,DLL 不会跨进程共享内存。在您的示例中,进程 A 和 B 都将获得一个单独的“数据”实例。

    如果您的设计希望 DLL 中的全局变量在使用该 DLL 的所有进程之间共享,您可以使用共享数据段,如 here 所述。可以通过共享数据段共享预先声明的数组和值类型,但绝对不能共享指针。

    【讨论】:

    • "Win32 DLL 被映射到调用进程的地址空间。默认情况下,每个使用 DLL 的进程都有自己的所有 DLL 全局和静态变量的实例。"这就是我要找的。谢谢!
    【解决方案3】:

    进程 B 将拥有自己独立的内存空间,与进程 A 无关。data 变量将在 B 的进程空间内创建。

    【讨论】:

    • 它是如何工作的?每次将 DLL 附加到进程时都会重新创建所有静态数据?那么它是如何“共享”的呢?
    • @user986654,进程之间不共享数据。每个进程都有自己的私有空间并重新创建数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2017-03-02
    • 2016-02-27
    • 1970-01-01
    相关资源
    最近更新 更多