是共享库/dll中的全局变量,跨进程共享

Posted

技术标签:

【中文标题】是共享库/dll中的全局变量,跨进程共享【英文标题】:Is global variable in a shared library / dll, shared across process 【发布时间】:2009-12-30 09:40:27 【问题描述】:

我正在开发一个共享库 (.so) 和 dll。我有一个在多个线程中更新的全局变量。所以我有用于同步的互斥锁。

我不清楚共享库中的全局数据是否跨进程共享。如果是,那么我需要使用信号量进行同步。据我了解,全局变量是数据段的一部分,所以我想了解 dll 如何跨进程管理全局数据。任何信息w.r.t。 dll 格式和段会有所帮助。

谢谢。

【问题讨论】:

相关问题很好地解释了 DLL 是如何工作的:***.com/questions/12229396/… 【参考方案1】:

默认情况下,不,全局变量不跨进程共享。

但是,您可以使用数据段 (data_seg) 来跨进程共享全局变量。您可以在标题为“How do I share data in my DLL with an application or with other DLLs?”的文章中找到有关 MSDN 的更多信息

【讨论】:

@CasperOne:默认情况下,共享库数据段会在每个进程之间复制吗? @Andy:我不知道你说的重复是什么意思。基本上,如果您链​​接到同一个 dll,您将能够跨进程共享值,如果这是您所要求的。否则,您能详细说明一下吗? @CasperOne:我认为 dll 的代码(文本)段是跨进程共享的。所以我想知道dll的数据段发生了什么。是否将dll中数据段的内容复制到进程数据段中。以及在动态加载 dll 期间这是如何发生的。【参考方案2】:

绝对没有。每个进程都有自己的虚拟内存空间,看不到其他进程的内存。两个进程甚至可以在同一个地址存储不同的值,比如 1000000 - 因为它们的虚拟地址“1000000”映射到不同的物理内存单元(例如,第一个进程映射到“2000000”,第二个进程映射到“3000000”。 共享 dll 不会改变任何内容。

【讨论】:

抱歉,这根本不是真的。 尝试阅读一些东西,例如从这个开始:msdn.microsoft.com/en-us/library/ms810627.aspx关于内存管理/虚拟内存映射和在win32平台上管理不同进程中的内存,然后在这里写任何东西:) 讽刺的是,你说“尝试阅读一些东西”,而事实上我发布了一个指向 MSDN 的链接,其中显示了具体做了什么,以及为什么你的答案是错误的。 我只是看不出有什么问题。 dll 全局变量是否跨多个进程共享?不。我们可以从您的链接中看到:“Win32 DLL 被映射到调用进程的地址空间。默认情况下,每个使用 DLL 的进程都有自己的所有 DLL 全局和静态变量的实例。”我回答了什么? “不。”那怎么了? 我认为您误解了这个问题。确实,每个进程都有自己的虚拟内存空间。但问题是“应用程序可以更改库中声明的全局变量吗?”。那么,进程是否与 dll 共享其命名空间?没那么简单。

以上是关于是共享库/dll中的全局变量,跨进程共享的主要内容,如果未能解决你的问题,请参考以下文章

C++ 静态库中的共享全局变量

动态链接 DLL 需要与其调用者共享一个全局变量

跨进程共享状态变量

C++ 静态库中的共享全局变量:Linux

Solaris 共享库和全局变量

如何在运行时确定共享库中全局变量的地址范围?