2009-03-21 10 views
2

Normalerweise eine Variable in einem CPP-Datei Ergebnisse in den Variablen mit global zur Verfügung, wie dies zu sein:Wie implementiert man eine globale Prozessvariable in C++?

.h file: 
extern int myGlobal; 
void work(); 

.cpp file: 
int myGlobal = 42; 
void work(){ myGlobal++; } 

Wenn die CPP-Datei in einer statischen Bibliothek platziert wird und mehr als eine gemeinsam genutzte Bibliothek (DLL) oder ausführbare Links gegen die statische Bibliothek, jede hat ihre eigene Kopie von myGlobal. work() würde seine eigene Version der Variablen ändern.

Meine Frage jetzt: Gibt es eine Möglichkeit, eine prozessweit eindeutige Variable oder Zeiger auf diese Variable zu bekommen? Ähnlich wie der Thread-lokale Speicher wäre für Thread-weite Variablen. Es muss nicht plattformunabhängig sein. Bonuspunkte, wenn es in Win32 funktioniert :)

Antwort

4

Simple: alle DLLs in der Prozessverknüpfung zu einer einzelnen DLL machen, die die Variable verfügbar macht.

3

Entweder statisch nicht verlinken (stick myGlobal in einer DLL), oder nur einmal gegen die statische Bibliothek verlinken (möglicherweise mehr von einem Schmerz im Nacken zu erreichen).

0

Ich schlage vor, Sie werfen einen Blick auf Boost.Interprocess, insbesondere this page auf die gemeinsame Nutzung von Speicher zwischen mehreren Prozessen. Dort können Sie herausfinden, wie Sie mit dieser Bibliothek einen gemeinsamen Speicherbereich erstellen, einen bereits erstellten öffnen (eigentlich "öffnen oder erstellen"), die Größe an Ihre Bedürfnisse anpassen und darauf zugreifen können. Es gibt ein einfaches Beispiel, das dich recht schnell voranbringen sollte.

+0

Frage sagt "prozessweit", nicht mehrere Prozesse. Shared Memory innerhalb desselben Prozesses ist wahrscheinlich ein wenig übertrieben. –

+0

Sie haben Recht. Aber es funktioniert und es ist nicht so schwer zu benutzen. Also warum nicht ? :) –

+0

Vorsicht: boost :: interprocess ist voller Fallen und Fallstricke. Zum Beispiel hat es auf einigen Plattformen eine Tendenz zu beschäftigt - warten in Dingen wie Wartebedingungen. Stellen Sie sicher, dass Sie den Boost-Code lesen, den Sie verwenden. –

0

Vielleicht ist dies Overkill für einen einzigen Prozess, aber ich habe shared sections verwendet, um etwas zu erreichen, was Sie ähnlich beschreiben.

+0

Da ich nur eine prozessweite Variable brauche, wären geteilte Sektionen zu viel. Danke für den Vorschlag! – vividos

Verwandte Themen