2009-12-30 208 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