当前位置: 首页 > 面试题库 >

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

张亦
2023-03-14
问题内容

我只想在进程与该进程调用的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上解决此问题的最简单方法是什么?

问题答案:

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

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

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



 类似资料:
  • 我有一个Flask应用程序在Gunicorn下运行,使用同步工作进程类型和20个工作进程。该应用程序在启动时读取大量数据,这需要时间和内存。更糟糕的是,每个进程都加载自己的副本,这会导致它花费更长的时间,占用20倍的内存。数据是静态的,不会更改。我想加载一次,让所有20名员工共享。 如果我使用设置,它只加载在一个线程中,并且最初只需要1X内存,但是一旦请求开始进来,它似乎会变成20X。我需要快速随

  • 问题内容: 我的高级Java课堂上有关线程的老师说了一些我不确定的东西。以下代码不一定会更新ready变量。根据他的说法,这两个线程不一定共享静态变量,特别是在每个线程(主线程与)在其自己的处理器上运行并且因此不共享相同的寄存器/缓存/等和一个CPU的情况下。不会更新其他。 从本质上讲,他说有可能在主线程中进行更新,而不是在中进行更新,因此将无限循环。 他还声称该程序可以打印或打印。我了解如何打印

  • 问题内容: 我参与了有关Linux库的一些辩论,并想确认一些事情。 以我的理解(如果我做错了请纠正我,稍后我将编辑我的文章)在构建应用程序时有两种使用库的方式: 静态库(.a文件):在链接时,会将整个库的副本放入最终应用程序中,以便调用方应用程序始终可以使用库中的功能 共享对象(.so文件):在链接时,仅通过相应的标头(.h)文件针对其API验证了对象。该库直到需要运行时才真正使用。 静态库的明显

  • 问题内容: 我知道可以在Python中的各个模块之间共享全局变量。但是,我想知道这种可能性的程度以及原因。例如, global_mod.py mid_access_mod.py bot_modif_mod.py 即使所有模块都共享全局变量x,也将打印“无”。为什么会这样呢?似乎x是在mew()分配给bot_modif_mod.py之前在mid_access_mod.py求值的。 问题答案: 发生这

  • 问题内容: 我是Java编程的新手。谁能说出Java中的全局变量和局部变量之间的区别? 问题答案: 您的问题有点困惑,因为您在标题中引用的是static / global,而在问题中引用的是global / local。 变量绑定到一个 类 , 每个类 将有 一个实例 。 类可以具有成员变量,并且该类的 每个实例 将有 一个实例 。 请注意,如果您有多个类加载器,这将变得更加复杂。在这种情况下,您

  • 问题内容: 我有一个下载器功能,可以并行下载多个文件。我使用以便下载同一文件的不同块。我想显示下载的状态栏。为此,我需要知道已经下载的总字节数()。 是否有一种方法可以设置将在所有这些进程和主进程之间共享的变量,以便每个进程都可以追加刚刚下载的字节数? 问题答案: 解决方案是利用新进程并传递共享的ctypes值: