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

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

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

谢谢。

【问题讨论】:

标签: dll shared-libraries


【解决方案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 共享其命名空间?没那么简单。
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多