ich habe jetzt schon ein größeres Programm, das mitunter 2 Stringlisten vergleicht, die jeweils in einer QStringList gespeichert sind.
inStringList = ISL
Liste in der gesucht wird
forStringList = FSL
Listenelemente, nach denen in der inStringList gesucht werden soll
Da das ganze mit mehreren Threads laufen soll, damit auch 2 oder mehr CPUs genutzt werden können, teile ich die FSL in mehrere teillisten auf und übergebe jedem Thread einen Teil.
Nun bekommt auch jeder Thread die ganze ISL - Liste (welche sehr lange und daher groß sein kann). Die ÜBergabe funktioniert hier mit einem Pointer und somit nutzen mehrere Threads den Speicherplatz, auf welchen dieser Pointer der ISL zeigt.
Wenn nun gleiche Elemente gefunden werden, müssten die betroffenen Elemente in der ISL nicht mehr beachtet werden und könnten aus der ISL gelöscht werden. So kann es vorkommen, dass mehrere Threads zugleich auf diesen Speicher (der immer über Pointer angesprochen wird) lesend und schreiben zugreifen und somit sicher Probleme entstehen.
Ich habe gelesen, dass man mit einem QMutex eine Variable schützen kann. Ich habe mir das entwa so überlegt:
Code: Alles auswählen
class thread1 : public QThread
{
QMutex mutexThread1;
QStringList *ISL;
...
}
//Thread
void thread1::run()
{
mutexThread1.lock();
ISL->() .. operationen lesen/schreiben
mutexThread1.unlock();
}
QStringList *inList=new QStringList;
// listenerstellung
QSTringList forlist;
for(..)
inList->append(sx);
// threads
thread1 *t1=new thread1(forlist,inList); //übergabe jeweils einmal per Value und einmal mit Pointer
thread1 *t2=new thread1(forlist,inList);
thread1 *t3=new thread1(forlist,inList);
//threads starten
t1->start();
t2->start();
t3->start();
*/
In der Doku steht, dass es folgende Möglichkeiten gibt:
QMutex
QMutexLocker
QReadLocker
QReadWriteLock
QWriteLocker
Ist eine dieser Klassen besonders geeignet für meine Aufgabe?
Wie schütze ich jetzt den Speicher, auf den der Pointer zeigt, richtig?
Wie kann ich testen, ob es keine Konflickte zwischen den Threads gibt?
Danke für eure Antworten, ich hoff ich habe nichts wichtiges vergessen.
Benutze Qt 4.7 auf Windows 7
acdc