在多个进程中加载​​相同的dll实例

时间:2011-05-13 17:47:59

标签: dll shared-memory

Lib1[dll]
{
class A
{
static int i=0;
}
}

Program1[exe] have reference to Lib1
{
 Class B
 {
    main()
    {
      A.i = 5;
    }
 }
}

Program2 [exe] have reference to Lib1
{
 Class C
 {
    main()
    {
      A.i = 5;
    }
 }
}

如果Program1和Program2同时执行,它们是否可能引用Lib1的单个实例,并且Program1中对A.i的静态变量所做的更改可用于Program2,反之亦然,

1 个答案:

答案 0 :(得分:8)

一般来说,不,你要求的是不可能或不推荐的。在大多数操作系统(Windows,Linux等)中,每个程序实例都在一个独立的进程地址空间中运行,该空间与所有其他进程隔离。在某些情况下,共享DLL的只读可执行代码可以在进程之间共享以减少总体内存消耗,但可写数据对于每个进程都是本地的。

您可以通过使用OS服务明确设置可由多个进程访问的共享内存区域来实现您的要求。在Windows中,可以通过使用所有参与者事先已知的名称创建named shared memory objects来完成此操作。然后,您可以将该内存块强制转换为结构类型,并在该内存区域中读取和写入字段,并且查看该共享内存的所有进程都将看到相同的数据。

由于多个进程同时运行,您还需要考虑如何更新共享内存区域中的数据。如果多个进程需要更新计数器字段或共享内存区域中的诸如此类,那么您需要围绕读取和写入该数据实现线程安全实践,例如互锁增量或使用命名的互斥对象作为独占访问锁。