Thread Zugriffe auf Attribute



  • Hallo zusammen,

    ich habe ein kleines Synchronisationsproblem bei Threads. Und zwar habe ich zwei Threads, die Lese- und Schreibzugriffe auf ein Attribut ausüben.
    Der eine Thread liest von dem Attribut, während der zweite Thread lesend und schreibend auf das Attribut zugreift. Mein Problem ist, das der zweite Thread über eine Methode einer DLL gestartet wird und dieser Methode das Attribut per Referenz übergeben wird. Dieses Attribut wird dann immer wieder innerhalb der DLL verändert und dadurch ändert sich der Wert des Attributes auch in dem ersten Thread.

    Meine Frage, wie kann ich dieses Attribut so schützen, das nur ein Thread auf das Attribut gleichzeitig zugreifen kann?

    Pseudo code:
    class 1
    public:
        int attribut;
        void setAttribut(int attr){this->attribut = attr;}
        int getAttribut(){ return attribut;}
    
    thread2:
    
    createThread(MethodeDLL(int &attribut));
    
    thread1:
    int var = getAttribut();
    

    Hat einer eine Idee wie ich die Zugriffe schützen kann? An den Code der DLL komme ich nicht ran und kann da auch nichts einbauen an code.

    Vielen Dank im voraus schon einmal.

    Mit freundlichem Gruß

    Buchenberg



  • http://de.wikipedia.org/wiki/Mutex sollte dir helfen

    ich vermute du benutzt die winapi dann siehe http://msdn.microsoft.com/library/en-us/dllproc/base/createmutex.asp
    bsp ist auch dabei



  • Danke für deine schnelle Antwort. Habe mir das ganze mal angeschaut. Mein Problem hierbei ist, das ich dem Thread der das Attribut per Referenz ändert leider keinen Code hinzufügen kann um einen Bereich zu erstellen indem ich über das Mutex ein lock bzw. ein unlock durchführen kann, da der eine Thread wie gesagt das Ganze per Referenz direkt an der Speicherstelle ändert, ohne das dieser eine set Methode aufruft, in der ich das lock und unlock einbauen könnte.

    Gibt es hierfür irgendwas in C++?

    Danke im voraus.

    Mfg Buchenberg



  • Hallo,

    Mit reinem C++ wirst Du da nicht weiterkommen, da C++ keine Threads kennt.
    Du musst schon die API des Betriebssystems benutzen.



  • Buchenberg schrieb:

    ...Mein Problem hierbei ist, das ... der eine Thread wie gesagt das Ganze per Referenz direkt an der Speicherstelle ändert, ohne das dieser eine set Methode aufruft, in der ich das lock und unlock einbauen könnte.
    ...

    Das ist ein typisches Beispiel dafür, warum getter/setter sinnvoll sind 😉
    Aber wenn Du kein Redesign durchführen kannst/willst, wird Dir nichts anderes übrigleiben, als jede Nutzung der Referenz (außerhalb der Klasse; im aufrufenden Code) per Mutex zu serialisieren.
    Das ist mühsam und fehleranfällig (wer weiß schon, ob sich nicht irgendwer eine andere Referenz/Pointer geholt (oder gar via Pointerarithmetik konstruiert) hat ?), aber ich sehe da sonst auch keinen anderen Weg, wenn Du multithreading brauchst.

    Gruß,

    Simon2.



  • Hallo zusammen, danke für Eure Antworten. Ein Redesign kommt leider nicht in Frage, da ich den Code für die DLL nicht habe. Werde es mit Mutex versuchen. Danke

    Grüße

    Buchenberg


Anmelden zum Antworten