Ich habe eine Multithread-Anwendung, die mit einer benutzerdefinierten Thread-Pool-Klasse ausgeführt wird. Die Threads führen alle die gleiche Funktion mit unterschiedlichen Parametern aus.Löschen von Zeiger führt manchmal zu Heap-Beschädigung
Diese Parameter werden an den Threadpool-Klasse mit dem folgenden Weg:
// jobParams is a struct of int, double, etc...
jobParams* params = new jobParams;
params.value1 = 2;
params.value2 = 3;
int jobId = 0;
threadPool.addJob(jobId, params);
Sobald ein Thread nichts zu tun hat, ist es die nächsten Parameter erhält und betreibt die Jobfunktion. Ich entschied, Sorge für die Löschung der Parameter in der Threadpool Klasse zu nehmen:
ThreadPool::~ThreadPool() {
for (int i = 0; i < this->jobs.size(); ++i) {
delete this->jobs[i].params;
}
}
aber wenn dies zu tun, habe ich manchmal einen Heapbeschädigung Fehler:
Invalid Address specified to RtlFreeHeap
Das Merkwürdige ist, dass in In einem Fall funktioniert es perfekt, aber in einem anderen Programm stürzt es mit diesem Fehler ab. Ich habe versucht, den Zeiger an anderen Stellen zu löschen: im Thread nach der Ausführung der Job-Funktion (ich bekomme den gleichen Heap-Fehler) oder am Ende der Job-Funktion selbst (kein Fehler in diesem Fall).
Ich verstehe nicht, wie das Löschen der gleichen Zeiger (ich überprüfte, die Adressen sind die gleichen) von verschiedenen Orten ändert nichts. Hat das irgendetwas damit zu tun, dass es Multithread ist?
Ich habe einen kritischen Abschnitt, der den Zugriff auf die Parameter behandelt. Ich glaube nicht, dass das Problem synchronisierter Zugriff ist. Wie auch immer, der Destruktor wird nur aufgerufen, sobald alle Threads fertig sind, und ich lösche keinen anderen Zeiger irgendwo anders. Kann Zeiger automatisch gelöscht werden?
Wie für meinen Code. Die Liste der Jobs ist eine Queue einer Struktur, bestehend aus der ID eines Jobs (um später die Ausgabe eines bestimmten Jobs abrufen zu können) und den Parametern.
getNextJob()
wird von den Threads (sie haben einen Zeiger auf den ThreadPool) jedes Mal aufgerufen, wenn sie ihren letzten Job ausgeführt haben.
Stoppen Sie alle Threads, die ausgeführt werden, bevor der ThreadPool-Destruktor aufgerufen wird? –
Ja, ich warte bis alle Threads fertig sind. – Wookai
Können Sie eine Quelle für mehr Ihrer ThreadPool-Klasse veröffentlichen, insbesondere addJob? Auch der Code verwendet, wenn Ihr Thread "den nächsten Parameter bekommt und die Job-Funktion ausführt". Was macht es mit den alten Parametern - befreit es sie? Quelle, bitte! – Roddy