2011-10-09 204 views
4

共享內存如何在DLL中工作?DLL中的共享內存

當DLL連接到進程時,它使用與進程相同的內存地址。假設我們在DLL中有以下函數:

int * data = 0; 
int foo() 
{ 
    if (!data) data = new int(random()); 
    return *data; 
} 

當進程A調用這個函數時,它會創建新的對象(int)並返回它的值。 但是現在進程B附加了這個DLL。它調用foo(),但我不明白它將如何工作,因爲data正在處理'內存空間。 B如何能夠直接使用它?

+0

在進程之間共享內存需要OS API支持,並可在Windows下使用。 – kenny

回答

5

你是正確的,DLL文件不要跨進程共享內存的進程空間內創建自己獨立的內存空間默認。在你的例子中,進程A和B都會得到一個單獨的「數據」實例。

如果您有一個設計想要在使用該DLL的所有進程中共享的DLL中具有全局變量,則可以使用here中描述的共享數據段。您可以通過共享數據段共享預先聲明的數組和值類型,但絕對不能共享指針。

+2

「Win32 DLL被映射到調用進程的地址空間中。默認情況下,每個使用DLL的進程都有其自己的所有DLL全局和靜態變量的實例。」這就是我一直在尋找的東西。謝謝! – user986654

0

進程B將有無關與流程答data變量B.

+0

它是如何工作的?每次將DLL附加到進程時,都會重新創建所有靜態數據?那麼它如何「共享」呢? – user986654

+0

@ user986654,進程之間不共享數據。每個進程都有自己的私有空間並重新創建數據。 –

+0

它不共享。 – Joe

2

你錯在這裏有兩個不同的概念--dll在這個意義上共享內存,所有沒有(永遠)會改變的東西都是共享的(物理上的)。它正在保存你的RAM,導致DLL中的很多數據是代碼和其他常量數據,所以系統只使用它的一個副本,無論有多少進程使用它。這在系統級別上很重要 - 從應用程序角度看,根本沒有共享。

然而,像這裏描述的內部數據不在進程間共享 - 每個進程都有自己的副本。如果您有興趣在進程之間共享內存,則需要其他機制。您可能對Creating Named Shared Memory感興趣。