2016-06-24 7 views
1

wir ein Stück Code, der TBB nutzt Aufgaben zum Laichen einige Verarbeitung auszuführen dies die folgenden TBB-Code erfolgt über die TBB-Thread-Pool zu initialisieren (die Anzahl der Kerne entsprechen):TBB Laich Aufgabe Speicherleck

tbb::task_scheduler_init(8); 

dann für jede Aufgabe, die wir zum laichen wollen wir den folgenden Code verwenden (wo Task aus der TBB :: Task-Klasse abgeleitet ist):

task = new (tbb::task::allocate_root()) MainTask(theAction, theOutputData); 
tbb::task::enqueue(*task); 

Wenn wir unseren Code ausführen starten wir ab einer bestimmten Menge mit von Speicher und dann wie das Programm ausführt und neue Aufgaben hervorbringt, wie oben beschrieben, der Speicher Die Nutzung nimmt mit der Zeit allmählich zu. In 40 Minuten der Ausführung erhöht es von 12KB zu 213KB. Dies ist trotz allem kein Ergebnis unseres Verarbeitungscodes und scheint darauf zurückzuführen zu sein, dass TBB den Speicher nicht von der TBB-allocate_root-Aufgabe freigibt, die wir erstellen, wenn sie ihre Ausführung so beendet haben, wie wir es erwarten.

Warum passiert das? Gibt es noch etwas, das wir tun müssen, um dieses Problem zu lösen, oder gibt es eine alternative Möglichkeit, die TBB-Aufgaben zu spawnen, ohne den Ansatz allocate_root zu verwenden, der dieses Problem löst?

Antwort

2

Keine Sorge. TBB speichert den Taskspeicher zwischen und verwendet ihn erneut, um die Leistung zu verbessern. Und es verfügt über einen speziellen Mechanismus zur Verhinderung von Speicherverlusten bei Producer-Consumer-Fällen, bei denen ein Thread weiterhin Aufgaben zuweist und ein anderer Thread sie nur konsumiert.

Wenn Sie immer noch einen Speicherverlust vermuten, benötigen Sie einen ausgefeilteren Test, der beweist, dass der Speicherverbrauch nach dem anfänglichen Anstieg nicht stoppt (natürlich ist es nichtlineare Funktion). TBB hat einen speziellen Komponententest zum Erkennen von Speicherlecks: siehe src/test/test_task_leaks.cpp