lesen/schreiben für shared memory



  • Hallo zusammen

    Problemstellung:
    Ich habe mit einem Programm in c++ über shm ein shared memory angelegt. Nun soll dieses Programm Daten von einem Controller lesen und über den angelegten speicher an n andere Programme schicken.

    Frage:

    • Gibt es für diesen shared memory einen shared mutex (ich glaube so nennt man das), so das ich keine inkonsistente Daten lese?

    • Können andere Programme, die eventuell auch in anderen Sprachen geschrieben sind ebenfalls mit einem mutex umgehen den ich in c++ gesetzt habe?

      • Ist es einfacher einfach eine C lib bereit zu stellen, die man dann einbinden muss?

    Erkenntnisse bis jetzt:
    Ich habe gesehen das es in shm semaphoren gibt, aber ich habe keine Ahnung wie ich schreiben/lesen umsetzen soll
    Ich habe gesehen das es im std shared mutex gibt ... nur habe ich jetzt nicht gefunden ob die dafür gehen und clang sagt mir er würde std::shared_mutex nicht finden (#include <mutex.h> #include <shared_mutex>)

    vielen Dank schon ein mal für eure Antworten und Erfahrungen
    EvD

    Lösung des Problems:
    als kleiner Abschluss des ganzen

    ich habe am ende Boost benutzt. Da gibt es shared Mutex um das ganze zu bewerkstelligen.
    Am ende habe ich eine Klasse 'DataEllement' gemacht die in den shm gelegt werden. Neben Read/write in verschiedensten formen hatte ich dann unter diese Variablen als Privat values gesetzt.
    Ich hilft einigen, die über den Eintrag hier stolpern 🙂

    private:
      boost::interprocess::interprocess_sharable_mutex mutex;
      T dataBlock;
    


  • Meinst mit shared memory etwas was mit shm_open angelegt wird? Wenn ja, dann kannst du POSIX Semaphore verwenden.



  • hi @Tyrdal

    wie gesagt, ich habe gesehen das es POSIX Semaphore gibt, die ich dann mitt dem gleichen key_t key anlegen kann ... nur muss ich gestehen fehlt mir gerade die Phantasie mir vor zu stellen wie ich damit das lese/schreibe Problem beheben kann.

    dann müsste ich für n Programme einen Value von n anlegen und die kosten für lesen bei 1 haben und zum schreiben bei n ... gibt es da keine schönere Variante?
    Es soll ja möglich sein das n Programme gleichzeitig lesen.





  • @Tyrdal ich glaube du hast meine Frage nicht so ganz verstanden ...
    mit dem Beispiel das du da geschickt hast würden bei jeder lesende auf den vorherigen lesenden warten, was ich nicht will.
    wenn ich sem_init nutze und 10 Programme habe, von denen gerade 5 lesen und einer schreiben will, kann es geschehen das 1er der lesenden fertig ist, sem_pos aufruft und die anderen 4 bekommen keine validen Daten mehr.

    Des weiteren sollte es Möglich sein das lesende Prozesse während der Laufzeit hinzu kommen können, also das nach 15 minuten es 12 Programme sind die simultan laufen, 1 schreibender (der immer existiert) und 11 lesende.

    oder verstehe ich das falsch?

    Ps: oder ich habe deine Antwort / das Beispiel nicht so ganz verstanden



  • @EvD Du willst also einen ReaderWriterLock auf Betriebssystemebene. Ich denke, diese antike API wird das nicht unterstützen.

    Statt, das über shared memory zu machen kannst du ja auch einen daemon bauen der die Daten verwaltet. Dann kann in eine Art Registry/DB geschrieben werden und Interessenten können Daten abfragen/abonnieren.



  • @Tyrdal sagte in lesen/schreiben für shared memory:

    @EvD Du willst also einen ReaderWriterLock auf Betriebssystemebene. Ich denke, diese antike API wird das nicht unterstützen.

    Natürlich tut sie das. Das ganze ist wunderbar erklärt in UNIX Network Programming, Vol.2, Stevens, 1999.



  • @john-0 Umso besser, schick ihm das Buch.



  • @Tyrdal sagte in lesen/schreiben für shared memory:

    @john-0 Umso besser, schick ihm das Buch.

    Es geistern im Netz Kopien herum, wenn es denn einen Bedarf gibt. Ok, bei Archive.org wird man fündig.



  • Dieser Beitrag wurde gelöscht!

Anmelden zum Antworten