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,反之亦然,
答案 0 :(得分:8)
一般来说,不,你要求的是不可能或不推荐的。在大多数操作系统(Windows,Linux等)中,每个程序实例都在一个独立的进程地址空间中运行,该空间与所有其他进程隔离。在某些情况下,共享DLL的只读可执行代码可以在进程之间共享以减少总体内存消耗,但可写数据对于每个进程都是本地的。
您可以通过使用OS服务明确设置可由多个进程访问的共享内存区域来实现您的要求。在Windows中,可以通过使用所有参与者事先已知的名称创建named shared memory objects来完成此操作。然后,您可以将该内存块强制转换为结构类型,并在该内存区域中读取和写入字段,并且查看该共享内存的所有进程都将看到相同的数据。
由于多个进程同时运行,您还需要考虑如何更新共享内存区域中的数据。如果多个进程需要更新计数器字段或共享内存区域中的诸如此类,那么您需要围绕读取和写入该数据实现线程安全实践,例如互锁增量或使用命名的互斥对象作为独占访问锁。