Tworzenie instancji obiektów w pamięci współdzielonej C ++

Potrzebujemy wielu programów do wywoływania funkcji we wspólnej bibliotece. Funkcje biblioteki uzyskują dostęp i aktualizują wspólną pamięć globalną. Wywołania funkcji każdego programu muszą wyświetlać tę wspólną pamięć globalną. Jest to jedno wywołanie funkcji, które musi zobaczyć aktualizacje dowolnego wcześniejszego wywołania funkcji, nawet jeśli zostało wywołane z innego programu. Ze względu na kompatybilność mamy kilka ograniczeń projektowych dotyczących sposobu działania funkcji udostępnianych przez bibliotekę współdzieloną:

Wszelkie elementy danych (zarówno standardowe typy danych, jak i obiekty) zadeklarowane globalnie muszą być widoczne dla wszystkich dzwoniących, niezależnie od wątku, w którym działa kod.Wszelkie elementy danych zadeklarowane lokalnie w funkcji są widoczne tylko wewnątrz tej funkcji.Dowolny standardowy typ danych lub instancja dowolnej klasy mogą pojawiać się lokalnie lub globalnie lub oba.

Jednym z rozwiązań jest umieszczenie wspólnej pamięci globalnej biblioteki w nazwanej pamięci współdzielonej. Pierwsze wywołanie biblioteki utworzy nazwaną pamięć współużytkowaną i zainicjuje ją. Kolejne wywołania programu otrzymają adres pamięci współużytkowanej i użyją jej jako wskaźnika do globalnej struktury danych. Instancje obiektów zadeklarowane globalnie musiałyby być dynamicznie alokowane w pamięci współdzielonej, podczas gdy instancje obiektów zadeklarowane lokalnie mogłyby być umieszczone na stosie lub w lokalnej stercie wątku wywołującego. Problemy powstają, ponieważ zainicjowane obiekty w pamięci globalnej mogą tworzyć i wskazywać podobiekty, które przydzielają (nową) dodatkową pamięć. Te nowe przydziały muszą również znajdować się w pamięci współdzielonej i być widziane przez wszystkich dzwoniących do biblioteki. Inną komplikacją są te obiekty, które zawierają ciągi, pliki itp., Mogą być również używane w programie wywołującym. Po zadeklarowaniu w programie wywołującym pamięć obiektu jest lokalna dla programu wywołującego, a nie współdzielona. Kod obiektu musi obsługiwać każdy przypadek. Wydaje nam się, że rozwiązanie będzie wymagało zastąpienia globalnego miejsca docelowego nowymi, regularnymi nowymi i usuwania operatorów. Znaleźliśmy projekt systemu zarządzania pamięcią, który wygląda, jakby działał, ale nie znaleźliśmy żadnych rzeczywistych implementacji. Jeśli ktoś wie o implementacji projektu zarządzania pamięcią Nathana Myersa (http://www.cantrip.org/wave12.html?seenIEPage=1) Byłbym wdzięczny za link do niego. Alternatywnie, jeśli ktoś wie o innym menedżerze pamięci współdzielonej, który mieści dynamicznie alokujące obiekty, chciałbym o tym wiedzieć. Sprawdziłem biblioteki Boost i wszystkie inne źródła, które mogę znaleźć, ale nic nie wydaje się robić tego, czego potrzebujemy. Wolimy sami nie pisać. Ponieważ wydajność i solidność są ważne, dobrze byłoby użyć sprawdzonego kodu. Z góry dziękuję za wszelkie pomysły / pomoc.

Dziękujemy za sugestie dotyczące bibliotek ATL i OSSP. Sprawdzam je teraz, chociaż obawiam się, że ATL jest zbyt Wincentryczny, jeśli cel okazuje się Uniksem.

Jeszcze jedna rzecz wydaje się nam jasna. Ponieważ obiekty mogą być dynamicznie tworzone podczas wykonywania, schemat zarządzania pamięcią musi być w stanie przydzielić dodatkowe strony pamięci współdzielonej. Teraz zaczyna wyglądać jak menedżer pamięci zastępczej sterty.

questionAnswers(4)

yourAnswerToTheQuestion