使用DLL在多个进程间共享全局变量

来源:互联网 发布:点云数据三维重建 编辑:程序博客网 时间:2024/05/16 18:08

     默认情况下,同一个程序启动多个进程,它们各自的变量值是不会相互影响的。第二个实例启动后,在修改全局变量的时候,系统会运用内存管理系统copy- on-write的特性来防止修改了第一个实例的数据,即系统会再分配一些内存,并将全局变量复制到这块内存中,每个实例使用自己的内存空间上的数据而互不影响。

有时候我们想在多个进程间共享数据,windows提供了这种方法,就是创建自己的共享数据节,并将需要共享的变量放入该内存中。如果是在相同程序的多个实例间共享数据,只要在exe文件创建共享节即可,否则就需要在DLL中创建共享节,其它进程加载该DLL来共享数据。方法如下:

struct tThrState
{
tThrState() : nTimeout(
0),nState(0),UpdTime(0)
{
}

int nTimeout;
volatile LONG nState;
volatile time_t UpdTime;
}
;

#pragma data_seg(".Shared")
tThrState g_ThrState[
65536= {tThrState()};
#pragma data_seg()

#pragma comment(linker, "/Section:.Shared,RWS")

 

g_ThrState是需要共享的数据,注意定义变量的时候需要进行初始化,否则变量不会放入这个自定义的数据节中,而会被放到未初始化的数据节中,这样就不能共享数据了。如果没有初始化,链接程序的时候会提示:LINK : warning LNK4039: 用 /SECTION 选项指定的节“.Shared”不存在。

通过这样的方法来定义全局变量,这个变量就可以在多个进程间共享了,一个进程修改了数据,其它进程的数据也被更新了。需要注意的是如果多个进程会修改数据那就需要加上一定的锁机制了。