shared sections



  • Hallo,
    ich habe mich in letzter Zeit ein bisschen mit DLLs beschäftigt.

    #pragma data_seg (".shared")
    DWORD test = 0;	
    #pragma data_seg ()
    

    das funktioniert. Über ein entsprechendes .def-File, teilen sich alle Instanzen der DLL die Variable test.

    #pragma data_seg (".shared")
    std::set<std::string> container;
    #pragma data_seg ()
    

    Hier liegt mein Problem. Die verschiedenen Instanzen scheinen - trotz .shared - verschiedene container zu benutzen.

    #pragma data_seg (".shared")		
    std::set<std::string>* container = NULL;
    #pragma data_seg ()
    
    ...
    
    /* in einer Init-Funktion */
    if(setModules==NULL) setModules = new std::set<std::string>;
    

    Nach dieser Vorgehnsweise teilen sich alle Instanzen den Inhalt des Containers, aber nur unter XP. Unter Windows ME funktioniert das nicht.

    Vielleicht ist der Ansatz ja komplett falsch. Aber ich kann mir das momentan nicht anders vorstellen. Wäre für jede Hilfe dankbar.



  • ups, kleine Korrektur: in der Init-Funktion steht natürlich

    if(container==NULL) container = new std::set<std::string>;
    


  • Sowas kann nicht funktionieren, da ja jeder Prozess seine eigene CRT verwendet und somit nicht auf gemeinsamen *dynamischen* Speicher zugeriffen werden kann! Und die STL verwendet dynamischen Speicher (also new).
    Mit den shared sections kannst Du nur "statischen" Speicher teilen. Wenn Du dynamischen Speicher teilen willst, dann musst Du MemoryMappedFiles nehmen.



  • Jochen Kalmbach schrieb:

    Sowas kann nicht funktionieren, da ja jeder Prozess seine eigene CRT verwendet und somit nicht auf gemeinsamen *dynamischen* Speicher zugeriffen werden kann! Und die STL verwendet dynamischen Speicher (also new).

    Klingt einleuchtend. Aber wieso funktioniert das unter Windows XP:

    #pragma data_seg (".shared")        
    std::set<std::string>* container = NULL;
    #pragma data_seg ()
    
    ...
    
    /* in einer Init-Funktion */
    if(container==NULL) container = new std::set<std::string>;
    

    Mit den shared sections kannst Du nur "statischen" Speicher teilen. Wenn Du dynamischen Speicher teilen willst, dann musst Du MemoryMappedFiles nehmen.

    Ok, danke.
    Mir ist aber noch nicht ganz klar ob - und wenn ja - wie man Container-Klassen der STL (mittels den FileMapping-Funktionen) sharen kann.
    Wahrscheinlich funktioniert das so direkt gar nicht und man muss das ganze erst hin und her konvertieren 😕


Anmelden zum Antworten