Containers (QMap) - Threadsafe

Alles rund um die Programmierung mit Qt
Antworten
tomf
Beiträge: 12
Registriert: 24. Oktober 2007 19:07

Containers (QMap) - Threadsafe

Beitrag von tomf »

Habe einen Thread der solange mein Container (QMap) nicht leer ist durch diesen iteriert und mit den Objekten etwas macht.

Das ganze schaut grob skizziert in etwa so aus:

Code: Alles auswählen

MyThread::run()
{
 QMapIterator<int, MyObject> i(map);
 while (i.hasNext()) {
     i.next();
     //do something....
 }
}
Dann gibts noch eine Methode, die es ermöglicht neue Objekte hinzuzufügen:

Code: Alles auswählen

MyThread::add(int key, MyObject obj)
{
  map.insert(key, obj);
}
Meine Frage ist jetzt wie ich das ganze mit Mutex absichern kann. Die Methode add kriegt vermutlich einfach einen QMutexlocker. Nur was passiert mit meinem Iterator wenn ein neues Objekt eingefügt wird? Ist der noch gültig? Wie kann ich meine Schleife absichern?
DeepDiver
Beiträge: 34
Registriert: 7. November 2007 10:10
Wohnort: Fürstenfeldbruck
Kontaktdaten:

Beitrag von DeepDiver »

Du solltest alle Opertionen auf dem Container mit einem Mutex absichern.

Ich würde nicht mit einem Iterator arbeiten, da Du während des gesamten Life-Cycle des Iterators den Mutex gelockt haben muß.

Besser: Kopie der Daten innerhalb des Locks - danach Verarbeitung außerhalb des Locks.

Desweiteren brauchst Du noch eine QWaitCondition brauchen, um den Thread schlafen zu legen (wenn's nix mehr zu tun gibt) und um ihn wieder aufzuwecken, wenn eine neues Item eingefügt wurde.

Schau auch mal hier:
http://doc.trolltech.com/4.3/threads-wa ... tions.html
Antworten