动态链接库 (.dll) 中的对象是否跨进程共享
Is Object in dynamic link library(.dll) shared across process
假设我的.dll文件中有两个类和一个.c文件。
class MyClass {
private :
int id;
Context* appContext;
static Context* statContext;
public:
a(){
appContext = NULL;
id = -1;
}
void setId(int a){
id = a;
}
void setContext(){
statContext = appContext = new Context();
}
Context* getContext(){
return appContext;
}
Contex* getStaticContex(){
return statContext;
}
int getId(){
return id;
}
}
class Context{
Contex(){};
~Context(){};
}
在我的.c文件中,有三个函数通过dllexport在.dll外部公开,其中包含
MyClass a;
void dllSetContext(){
a.SetContext();
}
Context* dllGetContext(){
a.getContext();
}
Context* dllGetStaticContext(){
a.getStaticContex();
}
- 现在加载 dll 后的一个进程调用 dllSetContext();
- 另一个进程也加载 dll 并调用 dllGetContext() 和dllGetStaticContext().它是否获取了 appContext 的实例,由第一个进程设置的统计上下文?
- 是否创建了两个单独的 MyClass 实例,每个实例都是单独的每个进程的实例
- 或者这两个进程共享一个 MyClass 实例?
我在这里的理解是静态的,全局变量不是在多个进程中共享的,而是在多个进程中共享的。
这取决于操作系统如何管理地址空间。在现代(32 位)Windows 操作系统中,每个进程都有一个地址。进程之间没有任何共同点。
在 DLL 中创建对象时,这没有什么不同。您可以在不同的进程中获得不同的实例。但它们可能会获得相同的虚拟地址。请记住,实例的地址仅在加载 DLL 的过程中有效。
当您为 Windows 3.x 编程时,这可能会有所不同,但我怀疑您是否这样做。
编辑 代码段是否以及如何在进程之间共享取决于实际的操作系统。在 WinCE 5.0 中,您有一个共享的进程槽。如果 DLL 在 sysgen 期间作为模块定位,则代码位于此共享槽中,对所有进程可见相同的地址范围。你在桌面Windows上找不到这个。
在某些操作系统中,同一代码段可能位于相同的物理地址中,但在依赖于进程的虚拟地址上可见。但是,如果您开发应用程序,则无需考虑它。代码只是一个进程可见的。当 DLL 的加载地址已被占用时,相同的 DLL 代码可以位于不同的地址。在这种情况下,O/S 会将 DLL 重新定位到空闲地址范围。这需要(一点)时间,可以通过为每个 DLL 设置不同的默认加载地址来调整。
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- MPI:检查是否有任何进程已终止
- 同一线程 ID 是否可以在同一进程中重复使用?
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- 如何在 Linux 下使用 c++ 知道文件是否被其他进程使用?
- 通过 pid 窗口判断进程是否存在
- 多个线程/进程是否可以在不同步的情况下同时从/写入文件的非重叠区域?
- 是否有任何 C 函数或 API 来获取当前登录用户下运行的进程列表
- 如何检查进程是否在C++中运行?
- 睡眠线程或进程的指令是否在线程/进程休眠时继续执行?
- 包含字符串的结构的 Boost 进程间向量是否需要特殊的分配器?
- 检查"提升进程间managed_shared_memory"是否已存在?
- 如何判断从 CreateProcess 启动的进程是否仍在运行
- (LINX-IPC 协议)如何确定具有 PID 的进程是否在C++中运行
- 有没有办法检查.exe(或进程)是否在远程计算机上运行
- 是否可以注入一个进程并获取给定的句柄,然后使用它们注入另一个进程
- 是否有可能以及如何使用log4cxx库每个进程创建独立的记录仪
- 等待() 等待进程是否消耗系统 CPU