2009-12-30 9 views
9

Zajmuję się udostępnianie biblioteki (.so) i biblioteki dll. Mam zmienną globalną, która jest aktualizowana w wielu wątkach. Mam więc blokadę mutex do synchronizacji.Czy zmienna globalna w bibliotece współużytkowanej/dll, udostępnione w całym procesie

Nie wiem, czy dane globalne w bibliotece współdzielonej są wspólne dla całego procesu. Jeśli tak, potrzebuję użyć semaforów do synchronizacji. Rozumiem, że zmienne globalne są częścią segmentu danych, więc chciałem zrozumieć, w jaki sposób biblioteka DLL zarządza globalnymi danymi pomiędzy procesami. Wszelkie informacje w.r.t. Format dll i segmenty będą pomocne.

Dzięki.

+0

Powiązane pytanie z dobrym wyjaśnieniem, jak biblioteki DLL naprawdę działają: http://stackoverflow.com/questions/12229396/unresolved-external-symbol-static-variable-variable-used-by-method -defined-in-h –

Odpowiedz

10

Domyślnie nie, zmienne globalne nie są współdzielone między procesami.

Można jednak użyć segmentu danych (data_seg), aby współdzielić zmienne globalne między procesami. Więcej informacji na temat MSDN można znaleźć w artykule zatytułowanym "How do I share data in my DLL with an application or with other DLLs?"

+0

@CasperOne: Domyślnie segment danych biblioteki współużytkowanej jest duplikowany w każdym procesie? – Andy

+0

@Andy: Nie wiem, co masz na myśli przez powielenie. Zasadniczo będziesz mógł dzielić wartości między procesami jeśli łączysz się z tą samą biblioteką dll, jeśli o to pytasz. W przeciwnym razie, mógłbyś rozwinąć? – casperOne

+0

@CasperOne: Myślę, że segment kodu (tekst) biblioteki DLL jest wspólny dla całego procesu. Tak więc chciałem wiedzieć, co dzieje się z segmentem danych biblioteki DLL. Czy zawartość segmentu danych z biblioteki dll jest kopiowana do segmentu danych procesowych. I jak to się dzieje podczas dynamicznego ładowania biblioteki dll. – Andy

0

Absolutnie NIE. Każdy proces ma swoją własną wirtualną przestrzeń pamięci i nie widzi pamięci innych procesów. Dwa procesy mogą nawet przechowywać różne wartości pod tym samym adresem, na przykład 1000000 - ponieważ ich wirtualne adresy "1000000" są odwzorowane na różne fizyczne komórki pamięci (na przykład na "2000000" dla pierwszego procesu i na "3000000" na sekundę) Shared dll nie zmienia nic w tym.

+0

Przepraszam, ale to po prostu nieprawda. – casperOne

+0

Spróbuj przeczytać coś, na przykład zaczynając od tego: http://msdn.microsoft.com/en-us/library/ms810627.aspx o zarządzaniu pamięcią/mapowaniu pamięci wirtualnej i zarządzaniu pamięcią w różnych procesach na platformie win32, przed pisaniem cokolwiek tutaj :) – user224564

+0

Ironiczne, jak mówisz "próbujesz coś przeczytać", gdy w rzeczywistości zamieściłem link do MSDN pokazujący dokładnie to, co zostało zrobione, a także dlaczego twoja odpowiedź jest błędna. – casperOne