我從Eric Lippert's answer瞭解到「兩個進程可以共享非私有內存頁面,如果有二十個進程全部加載同一個DLL,那麼進程全部共享該代碼的內存頁面,它們不共享虛擬內存地址空間,它們共享記憶。」DLL如何處理來自多個進程的併發?
現在,如果硬盤上的相同DLL文件在加載到應用程序後將共享相同的物理內存(不管是RAM還是頁面文件),而是映射到不同的虛擬內存地址空間,處理併發性相當困難?
據我所知,C++中的併發概念更多的是關於處理線程 - 一個進程可以啓動多個線程,每個線程可以運行在一個單獨的核心上,所以當不同的線程同時調用DLL時,可能會有數據競速,我們需要互斥,鎖定,信號,條件變量等等。
但是,DLL如何處理多進程?數據賽車的相同概念將會發生,不是嗎?有什麼工具可以處理?仍然是相同的工具集?
併發只有當你共享可寫數據的問題。這不是在這裏發生的。 –
我相信這些頁面是在寫入時共享的。因此,如果在DLL內部存在可變狀態(而不僅僅是代碼),每個進程都將獲得它自己的頁面版本。 (對於Windows來說,如果知道這是否可行,或者DLL內存是隻讀的,那麼這種方法不夠完善)。 – Thilo
@KerrekSB所以一個DLL不能擁有自己的可寫內存?一個DLL正在處理的所有內存是否由進程擁有? – athos