Nochmal ne frage zu std::list und mutltithreading?



  • Habe eine std::liste welche events enthält, jedes event hat eine attribut "Abstand") zum davor liegenden event!

    1. thread fügt event an/ein

    2. thread liest IMMER nur das erste event, beabeitet es und löscht es dann!

    der 1. thread darf nur events lesen und einfügen/anfügen, der 2.thread darf immer nur da erste event lesen und löschen..

    geht das ohne syncronisierung gut, oder ist die threadsicherheit von std:list nicht gegeben?



  • Wenn ich jetzt nichts übersehen habe, wär für dich std::queue schon fast besser geeignet, allerdings weiß ich weder bei queue noch bei list, ob man mit Threads arbeiten kann - das würd mich doch auchmal interessieren 🙂



  • Queue selbst ist nur ein Adapter, von daher sagt das garnichts aus - eine Queue, die als darunterliegenden Container std::list verwendet, ist mindestens genauso thread(un-)safe wie eine std::list selbst 😉



  • Es gibt zumindest ein list-Member, den beide Threads für ihre Arbeit verwenden - die Größenangabe size(). Von daher solltest du die Arbeit schon synchronisieren.



  • hrm... eigentlich is es nix weiter als 1 mutex, den man locked und unlocked, so viel arbeit is es wirklich net, um den zugriff auf die liste zu geben



  • BorisDieKlinge schrieb:

    Habe eine std::liste welche events enthält, jedes event hat eine attribut "Abstand") zum davor liegenden event!

    1. thread fügt event an/ein

    2. thread liest IMMER nur das erste event, beabeitet es und löscht es dann!

    der 1. thread darf nur events lesen und einfügen/anfügen, der 2.thread darf immer nur da erste event lesen und löschen..

    geht das ohne syncronisierung gut, oder ist die threadsicherheit von std:list nicht gegeben?

    Bedingung:
    - Liste mit einem Element.

    T1 holt sich begin() oder end() zum lesen
    T1 wird unterbrochen
    T2 Holt sich begin() bearbeitet und löscht.
    T1 wird wieder ausgeführt, aber begin()/end() ist nicht mehr valid
    -> rums!
    also kann es schief gehn.


Anmelden zum Antworten