Nochmal ne Frage zu std::list und Thread?



  • Habe eine std::liste, welche Elemente enthält! Jedes Element stellt eine Zeitbalken dar, welche hinteinader gestaffelt sind. Somit stellt die Liste einen Zeitstrang dar.

    std::list<Element> TimeLine;
    
    struct Element{
    
    double m_StartTime; //Abstand in Sekunden zum vorderen Element
    double m_dDuration; //Zeitspanne des Elements
    
    };
    

    Denke mal ihr versteht was ich meine.

    Über einen Thread lass ich nun die Liste entlang der Zeit durchlaufen, und lese so immer das erste Element der Liste und ziehe die vergangen Zeit von "m_dStarTtime" ab, bis es null ist, dasgleiceh dann mit "m_dDuration" . Ist dies FErtig wird das element "pop_front" gekickt und wird mit dem nächsten element weiter gemacht.

    Das ganze funktioniniert super:) nun möchte ich mit einem anderen Thread aber auf die Elemente zugreifen ohne syncronisation! Ist das gewählrleiste, solange der andere thread das erste Element nich von der liste kickt? weil sonst evtl. der iterator nicht mehr stimmt.

    Da der erste Thread ja immer nur das erste Element der Liste bearbeite(List/schreibt) dürfte ich ja mit nem anderen thread problemlos die anderen element lesen können???



  • Und was möchtest du jetzt wissen?

    Ob es Böse ist wenn zwei Threads gleichzeitig auf dem selben Objekt rumfummeln und der eine auch löscht.
    JA! - eigentlich immer, da weiß man nie was passiert egal ob list oder bool.



  • wenn ich nun element in keiner der beiden Threads verändere, wie siehts dann aus? Wenn zwei thread ihren eignen iterator auf die liste haben, könnten sie ja unabhängig von einander iterieren oder?



  • jupp, könnten sie.
    aber: alles was mit threads und gleichen objekten zu tun hat sollte mit vorsicht genossen werden. nicht umsonst gibt es etliche mechanismen um probleme zu vermeiden.



  • wenn ein thread einen iterator auf die liste hat ....
    und da gleichzeitig ein andere thread ein element loescht (pop_back)
    wird der iterator des ersten threads ungueltig ... sprich, undefiniertes verhalten

    du musst sogar jede variable vor ungewollten lesen schuetzen, wenn du diese aus nem anderen thread schreiben koenntest, es sei denn lesen und schreiben sind atomare Operationen ....
    Das heisst, wenn du einen wert schreibst, musst du sicherstellen das der andere Thread da nicht grad liest an der stelle ....

    In deinem Fall brauchst du etwas, sagen wir komplexeres, verhalten.

    du hasst 2 threads die lesen koennen, einer der threads davon kann auch (bei bedarf) schreiben. wenn der eine thread nur liest, darf er den anderen nicht blockieren.

    das heisst beim lesen duerfen mehrere threads in der section sein, der der schreiben will, muss erst warten bis die section leer ist, und muss sie dann fuers lesen sperren.
    Das wirst du nicht mit einem "Lock" Object schaffen, sondern dafuer wirst mindestens 2 brauchen ....
    einen Mutex(sonmderfall einer semaphore) fuer die schreib / lese Sperre, und vielleicht ne semaphore fuer den "lese zaehler" ...

    Oder du baust nen komplexeres Lock Object auf Basis von Events / Mutexen auf, wo nach lese oder schreibzugriff unterschieden wird, mit lesezaehler und so ...

    Ciao ...


Anmelden zum Antworten