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