Der folgende Thread liest sich vielleicht etwas seltsam - das Problem ist auch seltsam. Ich hoffe, es denkt sich doch jemand rein. Also Folgendes:
Ich habe ein kleines "Benchmark" in C++ geschrieben. Dazu hab ich mir ne Benchmarkklasse geschrieben, welche das Setup der Testdaten, die Anzahl an Schleifendurchläufen mit identischen Werten und das Zählen der Prozessor Ticks übernimmt.
Zusätzlich existieren eine Reihe von Algorithmenklassen, welche jeweils eine bestimmte Implementierung eines algorithmischen Problems darstellen, das die CPU in Schwitzen bringen soll. Das funtkioniert bis hier hin auch prächtig. Allerdings hab ich jetzt doch noch einen Weg gefunden, besagten Algorithmus zu Threaden. Das sieht jetzt so aus:
1) Benchmarkklasse bereitet Testdaten vor
2) Benchmarkklasse läuft in eine while(loops > 0) Schleife, in der iterativ mehrmals hintereinander der gethreadede Algorithmus ausgeführt wird (er ist ein eigenes C++ Objekt)
2a) Eine kleine Vorbereitungsmethode im Algorithmus erstellt nach dem Aufruf durch die Benchmarkklasse die beiden Threads (und macht noch ein bisschen was anderes).
2b) Diese Vorbereitungsmethode ruft dann den eigentlichen Algorithmus auf (durch Übergabe der Methode an die beiden Threads und join der beiden Threads)
3) Nach Rückkehr aus der Algorithmenmethode wird der Loopcounter um 1 dekrementiert (das passiert bereits wieder in der Benchmarkklasse) und der Algorithmus neu gestartet.
Die Anzahl der Loopcounts wird via Kommandozeile gesteuert und dient der Verringerung des Messfehler - bei kleinen Eingabewerten terminiert der Algorithmus binnen weniger als 1ms. Und ja, das ist mit Zählen von CPU Ticks messbar
Jetzt kommt aber das eigentlich interessante:
Wenn die Loopcount auf 1 steht, wird nach jedem Algorithmenlauf das Testdatenarray zerstört und etwas größer neu erstellt. Das Benchmark läuft dann in etwa in der zu erwartenden Geschwindigkeit.
Wenn ich aber die Loopcount meinetwegen auf 200 setze, dann wird das Benchmark grottenlahm. Ich spreche hier von einem Faktor von ca. 1000! (dass der Algorithmus 200 mal durchlaufen wird hab ich schon rausgerechnet)
Es sieht "fast" so aus, als könnte das Betriebssystem zur Ausführungszeit nach Terminierung des Algorithmus und damit der beiden Threads nicht sofort wieder 2 neue Workerthreads erstellen. Mach ich aber zwischen den einzelnen Loops eine kurze Pause, klappts zunehmend besser. Nur das steht im Konflikt mit der Zeitmessung.
Daher jetzt meine Frage: Weiß jemand, ob ein Thread wirklich dann vernichtet ist, wenn er terminiert hat, oder wird der vom Betriebssystem erst irgendwann wirklich "terminiert"? Kann es in diesem Zeitraum (zeitliche) Probleme geben, wenn neue Threads erstellt werden sollen? Kann man einen Thread, wenn er denn nach seiner Terminierung noch nicht wirklich weg ist, irgendwie von Hand töten (also im Source Code)? pthread_exit hat leider nicht geklappt....
Achja, derzeit läuft das ganze unter Linux mit pthreads. Unter Windows hat es ganz ähnliche Symptome gegeben!
Bin für jedwede Anregungen dankbar!
Ich habe ein kleines "Benchmark" in C++ geschrieben. Dazu hab ich mir ne Benchmarkklasse geschrieben, welche das Setup der Testdaten, die Anzahl an Schleifendurchläufen mit identischen Werten und das Zählen der Prozessor Ticks übernimmt.
Zusätzlich existieren eine Reihe von Algorithmenklassen, welche jeweils eine bestimmte Implementierung eines algorithmischen Problems darstellen, das die CPU in Schwitzen bringen soll. Das funtkioniert bis hier hin auch prächtig. Allerdings hab ich jetzt doch noch einen Weg gefunden, besagten Algorithmus zu Threaden. Das sieht jetzt so aus:
1) Benchmarkklasse bereitet Testdaten vor
2) Benchmarkklasse läuft in eine while(loops > 0) Schleife, in der iterativ mehrmals hintereinander der gethreadede Algorithmus ausgeführt wird (er ist ein eigenes C++ Objekt)
2a) Eine kleine Vorbereitungsmethode im Algorithmus erstellt nach dem Aufruf durch die Benchmarkklasse die beiden Threads (und macht noch ein bisschen was anderes).
2b) Diese Vorbereitungsmethode ruft dann den eigentlichen Algorithmus auf (durch Übergabe der Methode an die beiden Threads und join der beiden Threads)
3) Nach Rückkehr aus der Algorithmenmethode wird der Loopcounter um 1 dekrementiert (das passiert bereits wieder in der Benchmarkklasse) und der Algorithmus neu gestartet.
Die Anzahl der Loopcounts wird via Kommandozeile gesteuert und dient der Verringerung des Messfehler - bei kleinen Eingabewerten terminiert der Algorithmus binnen weniger als 1ms. Und ja, das ist mit Zählen von CPU Ticks messbar
Jetzt kommt aber das eigentlich interessante:
Wenn die Loopcount auf 1 steht, wird nach jedem Algorithmenlauf das Testdatenarray zerstört und etwas größer neu erstellt. Das Benchmark läuft dann in etwa in der zu erwartenden Geschwindigkeit.
Wenn ich aber die Loopcount meinetwegen auf 200 setze, dann wird das Benchmark grottenlahm. Ich spreche hier von einem Faktor von ca. 1000! (dass der Algorithmus 200 mal durchlaufen wird hab ich schon rausgerechnet)
Es sieht "fast" so aus, als könnte das Betriebssystem zur Ausführungszeit nach Terminierung des Algorithmus und damit der beiden Threads nicht sofort wieder 2 neue Workerthreads erstellen. Mach ich aber zwischen den einzelnen Loops eine kurze Pause, klappts zunehmend besser. Nur das steht im Konflikt mit der Zeitmessung.
Daher jetzt meine Frage: Weiß jemand, ob ein Thread wirklich dann vernichtet ist, wenn er terminiert hat, oder wird der vom Betriebssystem erst irgendwann wirklich "terminiert"? Kann es in diesem Zeitraum (zeitliche) Probleme geben, wenn neue Threads erstellt werden sollen? Kann man einen Thread, wenn er denn nach seiner Terminierung noch nicht wirklich weg ist, irgendwie von Hand töten (also im Source Code)? pthread_exit hat leider nicht geklappt....
Achja, derzeit läuft das ganze unter Linux mit pthreads. Unter Windows hat es ganz ähnliche Symptome gegeben!
Bin für jedwede Anregungen dankbar!