Synchronisierung von Initialisierungen im Shared Memory



  • Hi,
    kennt vielleicht jemand eine recht einfache Möglichkeit, wie man die Initialisierung von Variablen für zwei Prozesse im Shared Memory synchronisiert?

    D. h., wenn zwei Prozesse gleichzeitig gestartet werden, soll natürlich der schnellere die Variablen synchronisieren. Der zweite Prozess soll dann erkennen, dass die Variablen schon initialisiert wurden und diese dann verwenden.

    Danke im Voraus.

    L. G.
    Steffo


  • Mod

    soll natürlich der schnellere die Variablen synchronisieren.

    Nein. Wenn Variableninitialisierung ein Performanceproblem bei dir ist, dann hast du ganz andere Sorgen. Lass einfach einen festgelegten Prozess die Initialisierungen vornehmen. Wenn es arg viel zu initialisieren gibt, dann kannst du es auch aufteilen. Aber das sollte wie viel ausmachen? Sekundenbruchteile? Falls dieser Vorgang bei dir mehrmals pro Sekunde stattfinden sollte (und du die Frage deswegen für wichtig hältst), dann liegt da dein Problem, denn du hättest nicht verstanden, wie man mit Prozessen parallelisiert.



  • Bei Shared Memory brauchst Du doch fast immer einen zusätzlichen Synchronisierungspfad. Das macht man dann üblicherweise über Semaphoren oder so.

    War das die Frage?





  • Den Weg mit Semaphoren habe ich schon umgesetzt, aber wir sollen das auch mit Peterson machen.
    Die Lösung ist wohl ziemlich einfach: Ein festgelegter Prozess soll die Initialisierung machen. Danke, SeppJ!

    L. G:
    Steffo



  • Sollte man eigentlich in diesem Fall bei den globalen Variablen mit volatile arbeiten? Meine Lösung funktioniert zwar, aber ich kann ja nicht ausschließen, dass ein Prozess anstatt auf dem gemeinsamen Speicherberreich, im Register nachschaut bzw. schreibt.


  • Mod

    Was genau ist "dieser Fall"? volatile hat mit Multithreading in erster Näherung überhaupt nichts Nützliches zu tun. Wenn du das anders siehst, dann hast du etwas falsche beigebracht bekommen oder du hast gar nichts beigebracht bekommen und machst nun alle naiven Anfängerfehler selbstständig. In beiden Fällen solltest du lieber erst einmal lernen, wie das mit dem Multithreading, Nachrichten und der Synchronisierung von Zugriffen überhaupt geht. Oder kurz gesagt: Schnapp dir eine Threadingbibliothek und lies deren Tutorial, die bietet schon alles was du brauchst.



  • Naja, hier geht es um Prozesse.



  • Hab das mit dem Java-Schlüsselwort volatile verwechselt, welches dort eine vollkommen andere Bedeutung hat...



  • SeppJ schrieb:

    volatile hat mit Multithreading in erster Näherung überhaupt nichts Nützliches zu tun.

    Warum nicht? Ich kann doch eine volatile Variable als Abbruchkriterium für einen Thread nehmen und in einem Anderen setzen. Wenn sie nicht volatile wäre, könnte der erste Thread ewig loopen.


  • Mod

    wildwildwild schrieb:

    SeppJ schrieb:

    volatile hat mit Multithreading in erster Näherung überhaupt nichts Nützliches zu tun.

    Warum nicht? Ich kann doch eine volatile Variable als Abbruchkriterium für einen Thread nehmen und in einem Anderen setzen. Wenn sie nicht volatile wäre, könnte der erste Thread ewig loopen.

    volatile (in C und C++, nicht in Java!) bietet dir drei Dinge portabel:

    • Es macht eine lokale Variable imun gegen Änderung bei einem Rücksprung mit longjmp nach einem setjmp
    • Ermöglicht, dass Speicher durch externe Quellen geändert werden kann, wenn diese Änderung vom Programm selber ausgelöst wird
    • Ein paar Schweinereien mit Signalhandlern.

    Für Interthreadkommunikation möchtest du aber komplett andere Dinge:

    • Atomarer Zugriff: Nein, bietet volatile nicht
    • Speicherkonsistenz, d.h. ein anderer Thread sieht Änderungen in einer bestimmten Reihenfolge: Nein, das bietet volatile auch nicht

    Tatsächlicher Nutzen von volatile ist daher nur, das Programm übelst langsam zu machen 🙂 . Für Interthreadkommunikation nutzt du lieber richtige Memory-Fences und atomare Operationen.


Anmelden zum Antworten