Hallo,
bislang dachte ich, dass alle Threads alles Variablen teilen und dass man deshalb den Zugriff auf selbige "regeln" müsste.
Jetzt habe ich einen komischen Effekt, den ich mir nicht erklären kann:
eine Klasse hat einen Vector als Member, also z.B. so:
Eine statische Methode der gleichen Klasse wird als Wrapper verwendet, um eine Memberfunktion als Threadfunktion auszuführen. Beim Zugriff aus dem Thread auf den Vector gibt es dann einen Absturz.
Deshalb habe ich die unterschiedlichen Aufrufe mit Debug-Ausgaben vollgestopft und es sieht so aus:
// vor dem starten des Threads
if (!pool.empty()) fprintf(stderr, "pool has size of %lu\n", pool.size());
fprintf(stderr, "starte thread ...\n");
aThread->Start();
Der Code in der Threadfunktion (der Memberfunktion) sieht ungefär so aus:
fprintf(stderr, "check pool ...\n");
if (!pool.empty()) {
fprintf(stderr, "pool is not empty, so start work ...\n");
}
fprintf(stderr, "pool processed.\n");
Programm-Ausgabe mit valgrind:
starte thread ...
check pool ...
==15751== Thread 2:
==15751== Invalid read of size 8
==15751== at 0x40EE4A: std::vector<cThread*, std::allocator<cThread*> >::end() const (stl_vector.h:453)
==15751== by 0x40EB13: std::vector<cThread*, std::allocator<cThread*> >::empty() const (stl_vector.h:575)
Da ist Schluss mit meinem Latein. Der Aufruf von empty() vor dem Starten des Threads geht problemlos, der gleiche Aufruf aus dem Thread geht in die Hose? Muss ich da bei der Deklaration noch was bedenken/ändern?
Ob mir wohl jemand eine Taschenlampe reichen, bzw. Licht ins Dunkel bringen könnte?
Gruß Gero