Threads handeln
Verfasst: 2. Dezember 2005 19:09
Hallo,
um threads besser zu verstehen habe ich folgendes Szenario:
eine Basisklasse und davon 2 Threads. In der Basisklasse habe ich eine Variable, die ich per Adressübergabe an beide Threads weitergebe. Thread A erhöht die Variable um +1 Thread B -1. Starte und stoppe ich jeden Thread einzeln, dann ist alles ok, zusammen geht nicht.
Fragen:
1. Mir ist klar, das sie beide auf dem selben Speicher laufen, aber kann man den Thread oder den Teil des Speichers nicht gegen Mehrfachnutzung schützen, so das es da zu keinen Problemen kommt.
2. Der Idealfall wäre, wenn die Variable um 0 pendelt. Das bringt mich gleich zur nächsten Frage. Kann ich die Priörität von einem Thread erhöhen? Dann müßte sie langsam in eine Richtung laufen.
3. Welche Funktion kann ich in der Basisklasse nutzen um auch standig eine Anzeige auf der Konsole zu bekommen. Meine Basisklasse ist vom Typ QDialog. Mit run() habe ich da keinen Erfolg.
um threads besser zu verstehen habe ich folgendes Szenario:
eine Basisklasse und davon 2 Threads. In der Basisklasse habe ich eine Variable, die ich per Adressübergabe an beide Threads weitergebe. Thread A erhöht die Variable um +1 Thread B -1. Starte und stoppe ich jeden Thread einzeln, dann ist alles ok, zusammen geht nicht.
Code: Alles auswählen
void Thread_A::run()
{
QMutex mutex;
for (;;)
{
mutex.lock();
if (stopped)
{
stopped=false;
mutex.unlock();
break;
}
(*z)++;
if ( (*z)>10000000 ) (*z) = 0;
cerr << *z << " * " << z << " A\n";
mutex.unlock();
}
}Fragen:
1. Mir ist klar, das sie beide auf dem selben Speicher laufen, aber kann man den Thread oder den Teil des Speichers nicht gegen Mehrfachnutzung schützen, so das es da zu keinen Problemen kommt.
2. Der Idealfall wäre, wenn die Variable um 0 pendelt. Das bringt mich gleich zur nächsten Frage. Kann ich die Priörität von einem Thread erhöhen? Dann müßte sie langsam in eine Richtung laufen.
3. Welche Funktion kann ich in der Basisklasse nutzen um auch standig eine Anzeige auf der Konsole zu bekommen. Meine Basisklasse ist vom Typ QDialog. Mit run() habe ich da keinen Erfolg.
Code: Alles auswählen
cerr << *z << " * " << z << " B\n";