AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Allen Bauer: TThread Suspend/Resume ein "kolossaler Fehler"
Thema durchsuchen
Ansicht
Themen-Optionen

Allen Bauer: TThread Suspend/Resume ein "kolossaler Fehler"

Ein Thema von mjustin · begonnen am 2. Aug 2009 · letzter Beitrag vom 2. Aug 2009
Antwort Antwort
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#1

Allen Bauer: TThread Suspend/Resume ein "kolossaler Feh

  Alt 2. Aug 2009, 10:30
Kleine Umfrage:

wer wußte, dass die Methoden Suspend und Resume der Klasse TThread unsicher sind?

Allen Bauer schreibt im News Forum Beitrag "Fatal Threading Model!" (https://forums.codegear.com/message....ssageID=142516), dass die Aufnahme der Methoden Suspend und Resume in der TThread Klasse ein "kolossaler Fehler" war, der viele in die Irre geführt hat, und entschuldigte sich bei allen, bei denen es durch Verwendung dieser Methoden zu Problemen gekommen ist:

Zitat:
I fully admit that the inclusion of Suspend/Resume on TThread was a collosal mistake and has led many astray. I would rather work to rectify that mistake. My most sincere appology to all who have been bitten by any issue through the use of those methods.
Die Diskussion wurde ausgelöst durch Probleme, die durch einen bereits länger bekannten Fehler entstanden, und drehte sich auch um die Frage welche Kriterien verwendet werden um die Priorität eines Bugreports zu bestimmen.

Hier der QC Eintrag:
Using TThread.Resume may cause setting freed object value
http://qc.codegear.com/wc/qcmain.aspx?d=26291)
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Allen Bauer: TThread Suspend/Resume ein "kolossaler

  Alt 2. Aug 2009, 11:41
Vielleicht hilft Dir ja dieser Artikel aus der JDK weiter:
Why Are Thread.stop, Thread.suspend,
Thread.resume and Runtime.runFinalizersOnExit Deprecated?
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Allen Bauer: TThread Suspend/Resume ein "kolossaler

  Alt 2. Aug 2009, 11:48
Zitat von mirage228:
Gerne gelesen - ja wenn Delphi denn bei Resume einen Deadlock haben würde, das könnte man dann leichter auf die Ursache zurückführen. Der Bug führt jedoch zu einem schwer zu lokalisierenden Problem durch Überschreiben von Speicher:

Zitat:
"Even FastMM with FullDebugMode can't report the exact location of the bug. FastMM can only report that one of the
previous operations has corrupted memory."
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#4

Re: Allen Bauer: TThread Suspend/Resume ein "kolossaler

  Alt 2. Aug 2009, 12:43
Was für ein Glück, daß ich meine Threads immer sich selber an "definierter" Stelle in die Pause schicken lasse.

Also wenn ich das richtig verstehe, dann kommt es zu Problemen, wenn der Thread wärend der Manipulation von threadübergreifenden gemeinsam genutzten Resourcen pausiert wird und somit diese Operationen nicht beendet?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.581 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Allen Bauer: TThread Suspend/Resume ein "kolossaler

  Alt 2. Aug 2009, 13:04
Das Problem ist soweit ich das eben überflogen habe, das Resume zuerst den Thread fortsetzt und dann weitere Befehle ausführt. Der Thread selbst kann dort aber schon beendet und dann freigegeben sein, woraufhin der letzte Befehl, der ein privates Feld setzt, auf freigegebenen Speicher schreibt.

Ich verstehe allerdings nicht so ganz:
  • Erstens warum man Threads benutzt, die so schnell fertig sind. (äußerst ineffizient)
  • Und warum man zweitens einen eigenen Thread schreiben sollte, der sich im Konstruktor suspended erzeugt und dann selbst fortsetzt. Dass solch ein seltsames Konstrukt Probleme machen kann, damit hätte ich eigentlich direkt gerechnet...
Deshalb sind die Fälle, in denen ich Threads einsetze, von den Problemen nicht betroffen soweit ich das sehe. Und ich hatte bisher damit auch keine Probleme.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Allen Bauer: TThread Suspend/Resume ein "kolossaler

  Alt 2. Aug 2009, 15:50
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
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: Allen Bauer: TThread Suspend/Resume ein "kolossaler

  Alt 2. Aug 2009, 16:17
Zitat von mjustin:
wer wußte, dass die Methoden Suspend und Resume der Klasse TThread unsicher sind?
Ich. Wobei Suspend nicht unsicher ist. Man darf es nur nicht außerhalb des Threads nutzen (da man nicht weiß wo man den Thread gerade anhält). Und das (eigenliche) Problem mit Resume kenne ich seit ich meine AsyncCalls.pas Unit vor ein paar Jahren geschrieben habe. FreeOnTerminate+Resume ist tötlich.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.581 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Allen Bauer: TThread Suspend/Resume ein "kolossaler

  Alt 2. Aug 2009, 16:20
Stimmt, an eine echte Multithread-Serveranwendung hatte ich jetzt nicht gedacht. Da kann das natürlich vorkommen. Allerdings würde ich da die aktuellen Requests eigentlich ohnehin manuell verwalten und nicht einfach "zufällig" beim Ende irgendwo selbst sich freigeben lassen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Allen Bauer: TThread Suspend/Resume ein "kolossaler

  Alt 2. Aug 2009, 17:27
Zitat von jaenicke:
[*]Und warum man zweitens einen eigenen Thread schreiben sollte, der sich im Konstruktor suspended erzeugt und dann selbst fortsetzt. Dass solch ein seltsames Konstrukt Probleme machen kann, damit hätte ich eigentlich direkt gerechnet...[/list]
Wenn ich die Newsgroup richtig gelesen habe, war es damit leichter, den Fehler zu reproduzieren. Ob Resume innerhalb oder ausserhalb des Konstruktors aufgerufen wird, spielt für den Bug aber keine Rolle:

Zitat:
In my test app I call resume from outside the constructor with same results. The difference is that by calling it from within the constructor it is easier to reproduce the bug.
(Die erwähnte Testanwendung ist in der Attachment-Newsgroup zu finden)
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz