一尘不染

在进程和DLL之间共享全局/静态变量

linux

我只想在进程与该进程调用的dll之间共享静态/全局变量。exe和dll在相同的内存地址空间中。我不希望在其他进程之间共享该变量。


问题的阐述:

说是有一个静态/全局变量xa.cpp。exe foo.exe和dll bar.dll都具有a.cpp,因此变量x都在两个图像中。

现在,foo.exe动态加载(或静态)bar.dll。然后,问题是该变量x是否由exe和dll共享。

在Windows中,这两个家伙 永远不会 共享x:exe和dll将具有的单独副本x。但是,在Linux中,exe和dll确实共享变量x

不幸的是,我想要Linux的行为。我首先考虑pragma data_seg在Windows上使用。但是,即使我正确设置了共享数据段,foo.exebar.dll从不共享x。回想一下bar.dll已加载到的地址空间中foo.exe。但是,如果我运行的另一个实例foo.exex则被共享。但是,我不想x被其他进程共享。因此,使用data_seg失败。

我可能会通过在exe和dll之间建立一个唯一的名称来使用内存映射文件,这就是我现在正在尝试的名称。


两个问题:

  1. 为什么Linux和Windows的行为不同?有人可以解释更多吗?
  2. 在Windows上解决此问题的最简单方法是什么?

阅读 809

收藏
2020-06-02

共1个答案

一尘不染

首先,我发现这篇文章对动态链接库非常有趣且简洁明了(本文仅适用于Linux,但是这些概念当然也适用于Windows,您可能会对自己的不同行为有所了解。看到)。尤其是静态和动态加载之间的根本区别。

我认为您想要或正在尝试实现的是“跨模块单例”模式。如果您阅读了该主题的答案,那么我不知道如何比Ben
Voigt回答该帖子更好地回答您的问题。之前(实际上是几次),我已经使用他描述的方法实现了一个跨模块的单例,它的工作原理很吸引人。

当然,仅将全局变量放在cpp文件中就不能保持其清洁性。您将必须使用静态指针以及一些访问器函数和引用计数。但是可以。我不太确定如何避免foo.exe和foo.exe在一个bar.dll中共享相同的全局数据实例,我从没有这样做,也没有真正想出一种方法抱歉

2020-06-02