Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - GetMem/FreeMem Threadsafe?


Spaceguide - Mi 10.11.04 20:17
Titel: GetMem/FreeMem Threadsafe?
Eine Applikation mit mehreren Rendering-Threads schmiert auf einer Multiprozessor-Maschine nach einiger Zeit ab. Manchmal mit einer Exception, manchmal verschwindet sie einfach, mal bleibt sie hängen. Wenn man die Applikation auf einen Prozessor zwingt (Affinity), dann läuft sie ohne Probleme bis zum jüngsten Tag. Der Code in den Threads an sich scheint wirklich korrekt zu sein, es wird nur auf interne, direkt von TObject abgeleitete Objekte zugegriffen, es wird nur lesend auf externe Arrays zugegriffen, kein Synchronize aufgerufen und ordentlich mit Waitfor auf sie gewartet, müsste also butterweich laufen. Das Erzeugen und Freigaben übernimmt der VCL-Thread. Auf jeden Fall ist nach ein paar Minuten hoher Last Schluss.

Jetzt habe ich den Heapmanager durch RecyclerMM ersetzt (http://glscene.sourceforge.net/RecyclerMM.htm) und alle Probleme sind verschwunden, läuft jetzt schon zig Stunden durch.

Die Frage jetzt: Race-Conditions sind eigentlich ziemlich unwahrscheinlich. Ist da vielleicht ein Bug im GetMem/FreeMem (D3) ?


Motzi - Mi 10.11.04 21:42

Hallo und :welcome: im DF!

Ich hatte auch schonmal ähnliche Beobachtungen beim Delphi-MemoryManager gemacht, ebenfalls in einer multithreaded Application - allerdings auf einem SP-System, dafür aber mit doch mit ner Menge Threads (bei kleinen Tests mit wenigen Threads gabs auch nie Probleme). Ich hab damals in der DP nachgefragt ob jemand ähnliche Erfahrungen gemacht hat: http://www.delphipraxis.net/topic38080_fehler+in+delphimemorymanager.html&highlight=

Nachdem, wie im DP-Thread erwähnt, der Fehler weg war als ich auf VirtualAlloc/VirtualFree umgestiegen bin, und auch Muetze in der DP es angesprochen hat tippe ich auch auf einen Fehler im Delphi-MM.

Gruß, Motzi


Spaceguide - Mi 10.11.04 22:38

Den HPMM hatte ich auch einmal verwendet, da hat das Programm aber auf einmal viermal soviel Speicher gefressen, das war zuviel. Mit dem RecyclerMM bin ich zufrieden, auch wenn die Geschwindigkeitsvorteile durch SSE und Alignment unter die Messfehlerschwelle fallen ;-)


Spaceguide - Do 11.11.04 19:56

Hoppla, hab gerade anhand einer Testapplikation gesehen, dass das nackte Lesen von gemeinsam genutzten Strings nicht threadsafe ist :-(. Liegt wahrscheinlich an den Reference-Countern. Muss halt doch ne CriticalSection her ;-)


Motzi - Do 11.11.04 20:42

Hm.. du verwendest D3, richtig? Seit Delphi5 sollten die Referenzzähler threadsafe sein..


Spaceguide - Do 11.11.04 20:56

Ja, ich hab zwar auf Delphi 7/8 upgegradet, aber das Programm kann ich wegen einer Lib, die ich nicht im Quellcode vorliegen habe, nur unter D3 kompilieren (Randfrage: Gibt's ne gute Image-IO-Lib für Delphi, kann auch was kosten?).

Die kleine Testapplikation scheint unter D7 ohne Probleme zu laufen, mit D3 kompiliert schmiert sie recht zügig ab (Vorteil, wenn man auf einer Dual-Maschine programmiert).

Mal weiter testen... Danke für deine Antworten.