我只想在进程与该进程调用的dll之间共享静态/全局变量。exe和dll在相同的内存地址空间中。我不希望在其他进程之间共享该变量。
问题的阐述:
说是有一个静态/全局变量x在a.cpp。exe foo.exe和dll bar.dll都具有a.cpp,因此变量x都在两个图像中。
x
a.cpp
foo.exe
bar.dll
现在,foo.exe动态加载(或静态)bar.dll。然后,问题是该变量x是否由exe和dll共享。
在Windows中,这两个家伙 永远不会 共享x:exe和dll将具有的单独副本x。但是,在Linux中,exe和dll确实共享变量x。
不幸的是,我想要Linux的行为。我首先考虑pragma data_seg在Windows上使用。但是,即使我正确设置了共享数据段,foo.exe也bar.dll从不共享x。回想一下bar.dll已加载到的地址空间中foo.exe。但是,如果我运行的另一个实例foo.exe,x则被共享。但是,我不想x被其他进程共享。因此,使用data_seg失败。
pragma data_seg
data_seg
我可能会通过在exe和dll之间建立一个唯一的名称来使用内存映射文件,这就是我现在正在尝试的名称。
两个问题:
首先,我发现这篇文章对动态链接库非常有趣且简洁明了(本文仅适用于Linux,但是这些概念当然也适用于Windows,您可能会对自己的不同行为有所了解。看到)。尤其是静态和动态加载之间的根本区别。
我认为您想要或正在尝试实现的是“跨模块单例”模式。如果您阅读了该主题的答案,那么我不知道如何比Ben Voigt回答该帖子更好地回答您的问题。之前(实际上是几次),我已经使用他描述的方法实现了一个跨模块的单例,它的工作原理很吸引人。
当然,仅将全局变量放在cpp文件中就不能保持其清洁性。您将必须使用静态指针以及一些访问器函数和引用计数。但是可以。我不太确定如何避免foo.exe和foo.exe在一个bar.dll中共享相同的全局数据实例,我从没有这样做,也没有真正想出一种方法抱歉