Autor Beitrag
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Mi 10.11.04 20:17 
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 (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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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: www.delphipraxis.net....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

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Spaceguide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 11.11.04 20:42 
Hm.. du verwendest D3, richtig? Seit Delphi5 sollten die Referenzzähler threadsafe sein..

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Spaceguide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: 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.