Zitat von
jaenicke:
Ich verstehe allerdings nicht so ganz:[list][*]Erstens warum man Threads benutzt, die so schnell fertig sind. (äußerst ineffizient)
Der Fehler tritt häufiger auf, wenn viele Threads gestartet und beendet werden - also zum Beispiel in einer Serveranwendung, die viele Requests von verschiedenen Clients parallel verarbeitet. Die Wahrscheinlichkeit, dass einer der Threads bereits das Free ausgeführt hat bevor auf seine Instanzvariable zugegriffen wird, hängt auch von der Last (Anzahl Threads) ab. Die absolute Ausführungszeit des Threads ist für das Auftreten des Bugs nicht entscheidend. Kritisch wird es, sobald diese Zeit kleiner als die Zeit ist, die zwischen der Ausführung von zwei Stellen in der Resume Methode vergeht:
Zitat:
The problem is, if there are many threads created and freed, the delay after ResumeThread(FHandle) could be big enough for the thread to finish and free itself before the routine arrives at FSuspended := False.
http://qc.embarcadero.com/wc/qcmain.aspx?d=26291