![]() |
Allgemeine Fragen zu Thread-Safety
Hallo zusammen,
ich habe im Moment immer wieder das Problem, dass ich nicht so recht weiß, ob hier oder da was absichern muss oder nicht. Hier mal ein paar Beispiele, bei denen mir das irgendwie nicht so recht klar ist. Bitte immer mit Begründung antworten und nicht rein aus dem Bauch heraus :thumb: Eines noch vorab: Lock() = FCriticalSection.Enter(), Unlock() = FCriticalSeciton.Leave().
|
AW: Allgemeine Fragen zu Thread-Safety
Zu Punkt 1 und 2:
Erzeugen und und freigeben sollte immer nur einer. Alles andere ist imho, wie du schon festgestellt hast, ein Designfehler. Beim Konstruktor ist es noch einfacher: solange der sich noch nicht zurückgemeldet hat, weiß ja niemand von dem neuen Objekt. Also kann es innerhalb des Objektes keine Kollision geben. 3.: Passt so. |
AW: Allgemeine Fragen zu Thread-Safety
5. Nicht (unbedingt) threadsichere Methoden: Ich habe gerade einen Konstruktor geschrieben, der die Format-Methode nutzt. Ich weiß ja pauschal nicht, ob diese Methode threadsafe ist oder nicht. Daher hätte ich dann diesen Code ...
Delphi-Quellcode:
... wie folgt umgeschrieben. Dieses Problem ist ja auch auf jede andere beliebige Methode "anwendbar" und nich auf Konstruktoren beschärnkt.
constructor TMyObject.Create(const AFormat: string; const Args: array of const);
begin inherited Create(); FMessage := Format(AFormat, Args); end;
Delphi-Quellcode:
constructor TMyObject.Create(const AFormat: string; const Args: array of const);
begin inherited Create(); // Erzeugt eine CriticalSection, da von // entsprechender Basisklasse abgeleitet Lock(); try FMessage := Format(AFormat, Args); finally Unlock(); end; end; |
AW: Allgemeine Fragen zu Thread-Safety
5.: Das dürfte wirkungslos sein, da die CriticalSection scheinbar pro Objekt existiert. So würde zwar jeder Thread das Lock setzen, aber kein anderer würde sich daran stören.
PS: Mir scheint das Problem besteht bei allen anderen Beispielen auch. PPS: Bei einem zeitkritischen Projekt habe ich mal festgestellt, das TCriticalSection entschieden langsamer war, als RTL_CRITICAL_SECTION. Warum konnte ich leider nicht ergründen |
AW: Allgemeine Fragen zu Thread-Safety
Zitat:
2. nimmt man deswegen immer die threadsichere Variante von Format, bei der man die FormatSettings mit angibt. Es ist nämlich nicht der Code von Format, der nicht threadsicher ist, sondern die Verwendung der globalen FormatSettings. |
AW: Allgemeine Fragen zu Thread-Safety
Zitat:
Zitat:
Zitat:
|
AW: Allgemeine Fragen zu Thread-Safety
Tschaa ... jetzt wolle ich ne kleine Demoapp schreiben (bezüglich der Zeit) und da taucht das Problem nicht mehr auf.
Mal sehen, vielleicht finde ich die alten Sourcen noch mal. |
AW: Allgemeine Fragen zu Thread-Safety
Zitat:
|
AW: Allgemeine Fragen zu Thread-Safety
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz