Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态链接库(.dll)中的对象是否跨进程共享_C++_Dll_Multiprocessing_Dynamic Linking - Fatal编程技术网

C++ 动态链接库(.dll)中的对象是否跨进程共享

C++ 动态链接库(.dll)中的对象是否跨进程共享,c++,dll,multiprocessing,dynamic-linking,C++,Dll,Multiprocessing,Dynamic Linking,假设我的.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 =

假设我的.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的实例, statContext由第一个进程设置
  • 是否创建了两个独立的MyClass实例,每个实例都是独立的 每个进程的实例
  • 或者这两个进程共享一个MyClass实例

我在这里的理解是,静态和全局变量不是跨多个进程共享的,而是其他变量跨多个进程共享。

这取决于操作系统如何管理地址空间。在现代(32位)Windows操作系统中,每个进程都有一个地址。进程之间没有任何共同之处

在DLL中创建对象时,这没有什么不同。在不同的过程中会得到不同的实例。但他们可能会得到相同的虚拟地址。请记住,实例地址仅在加载DLL的进程中有效

当您为Windows3.x编程时,这可能会有所不同,但我怀疑您是否这样做

编辑是否以及如何在进程之间共享代码段取决于实际的O/S。在WinCE 5.0中,您有一个共享的进程槽。如果DLL在sysgen期间作为模块定位,则代码位于此共享插槽中,所有进程都可以在同一地址范围内看到。在桌面窗口中找不到此项


在某些O/S中,同一代码段可能位于同一物理地址中,但在依赖于进程的虚拟地址中可见。但是如果你开发一个应用程序,你不需要考虑它。代码在一个进程中是可见的。当DLL的加载地址已被占用时,相同的DLL代码可以位于不同的地址。在这种情况下,O/S会将DLL重新定位到空闲的addrrss范围。这需要(一点)时间,可以通过为每个DLL设置不同的默认加载地址来进行调整。

这是否意味着对象创建代码是跨进程共享的,而不是对象共享的?对于32位及以上的WIN64、Unix系统(linux、mac)是否也一样?谢谢