2009-12-30 150 views
9

我正在开发共享库(.so)和dll。我有一个全局变量在多个线程中更新。所以我有用于同步的互斥锁。共享库/ dll中的全局变量,跨进程共享

我不清楚共享库中的全局数据是否跨进程共享。如果是这样,我需要使用信号量进行同步。据我所知,全局变量是数据段的一部分,所以我想了解如何跨进程管理全局数据。任何信息w.r.t. DLL格式和段将有所帮助。

谢谢。

+0

有关如何真正的DLL工作的很好解释的相关问题:http://stackoverflow.com/questions/12229396/unresolved-external-symbol-static-variable-variable-used-by-method -defined-in-h – 2012-09-01 20:40:55

回答

10

默认情况下,不会在进程间共享全局变量。

但是,您可以使用数据段(data_seg)为了跨进程共享全局变量。您可以在标题为“How do I share data in my DLL with an application or with other DLLs?

+0

@CasperOne:默认情况下,共享库数据段会在每个进程中重复吗? – Andy 2009-12-30 19:29:19

+0

@Andy:我不知道你的意思是重复的。基本上,你将能够跨进程共享值如果你链接到相同的DLL,如果这就是你要求的。否则,你可以详细说明吗? – casperOne 2009-12-30 20:12:01

+0

@CasperOne:我认为dll的代码(文本)段是跨进程共享的。所以我想知道dll的数据段发生了什么。是否将来自dll的数据段的内容复制到过程数据段中。以及在动态加载dll时如何发生这种情况。 – Andy 2009-12-31 14:08:57

0

的文章中找到有关MSDN的更多信息。每个进程都有自己的虚拟内存空间,并且没有看到其他进程的内存。两个进程甚至可以在同一地址存储不同的值,比如说1000000--因为他们的虚拟地址“1000000”被映射到不同的物理内存单元(例如,第一个进程的“2000000”,第二个进程的“3000000”) 共享的dll并不会改变任何东西。

+0

对不起,但事实并非如此。 – casperOne 2009-12-30 10:03:08

+0

尝试阅读某些内容,例如以下内容开始:http://msdn.microsoft.com/zh-cn/library/ms810627.aspx关于内存管理/虚拟内存映射和管理win32平台上不同进程中的内存,然后写入这里的任何东西:) – user224564 2009-12-30 10:13:00

+0

具有讽刺意味的是,如果你说“尝试阅读某些东西”,实际上我发布了一个MSDN链接,显示完成了什么,以及为什么你的答案是错误的。 – casperOne 2009-12-30 19:44:10