Seite 1 von 1

Containers (QMap) - Threadsafe

Verfasst: 7. Dezember 2007 13:49
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?

Verfasst: 7. Dezember 2007 14:07
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