Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#1

Implementierung TSingleton für thread-safety (z.B. Spring4D)

  Alt 9. Apr 2020, 11:20
Hallo zusammen,

ich beschäftige mich gerade mit Singletons, und es wird üblicherweise das Erzeugen mit CS abgesichert,
so wie hier in Spring4D

Delphi-Quellcode:
class function TSingleton.GetInstance<T>: T;
begin
  if not Assigned(TSingleton<T>.fInstance) then
  begin
    fCriticalSection.Enter;
    try
      if not Assigned(TSingleton<T>.fInstance) then
        TSingleton<T>.fInstance := T.Create;
    finally
      fCriticalSection.Leave;
    end;
  end;
  Result := TSingleton<T>.fInstance;
end;
Die eigentliche zu kapselnde Klasse <T> muss aber auch threadsicher sein, wenn da mehrere Threads global drauf zugreifen können.

Ich frage mich ob man dafür in einfachen Fällen nicht die bereits bestehende Instanz von fCriticalSection nehmen könnte / sollte.

So sparte man zumindest unnötige CS-Ressourcen in der zu kapselnden Klasse ein.
Das entspräche womöglich nicht einer optimalen Trennung der "Concerns", aber
könnte doch die Ressourcen und Performance optimieren.

Die zu kapselnde Klasse könnte für den Fall von einer speziellen Klasse abgeleitet sein,
z.B. type T = class; für alle nicht sicheren Fälle wie bisher, type T = class(TSingletonThreadsafe);

Abhängig von dem Type der Klasse könnte dann die CS im Create( FCriticalSection ); übergeben werden.

Oder spricht etwas Grundsätzliches dagegen, und es gäbe es sinnvollere Möglichkeiten
das Konstrukt threadsafe zu machen ?

Geändert von Rollo62 ( 9. Apr 2020 um 11:22 Uhr)
  Mit Zitat antworten Zitat