Aquire Singleton-Klasse Instance Multithread
Um die Instanz der Klasse mit Singleton-Muster zu erhalten, möchte ich die folgende Funktion verwenden:
Dies ist eine Skizze
interface
uses SyncObjs;
type
TMCriticalSection = class(TCriticalSection)
private
Dummy : array [0..95] of Byte;
end;
var
InstanceNumber : Integer;
AObject: TObject;
CriticalSection: TMCriticalSection;
function getInstance: TObject;
implementation
uses Windows;
function getInstance: TObject;
begin
//I Want somehow use InterlockedCompareExchange instead of CriticalSession, for example
if InterlockedCompareExchange(InstanceNumber, 1, 0) > 0 then
begin
Result := AObject;
end
else
begin
CriticalSection.Enter;
try
AObject := TObject.Create;
finally
CriticalSection.Leave;
end;
InterlockedIncrement(InstanceNumber);
Result := AObject
end;
end;
initialization
CriticalSection := TMCriticalSection.Create;
InstanceNumber := 0;
finalization;
CriticalSection.Free;
end.
Drei Fragen:
1- Ist dieser Design-Thread sicher? Besonders das mit InterlockedExchange Part.
2- Wie verwende ich den InterlockedCompareExchange? Ist es möglich zu tun, was ich versuche?
3- Ist dieses Design besser, als den gesamten Code innerhalb des Bereichs des kritischen Abschnitts einzubeziehen?
Bemerkung: Mein Objekt ist threadsicher, nur die Konstruktion muss serialisiert werden!
Dies ist nicht der gesamte Code, sondern nur der wichtige Teil, ich meine, die Funktion getInstance.
I BRAUCHEN um eine Art Singleton-Objekt zu verwenden.
Gibt es eine Möglichkeit, InterlockedCompareExchange zum Vergleichen zu verwenden, wenn der Wert von InstanceNumber Null ist?
Und
1 - Erstellen Sie das Objekt nur, wenn 0 ist, andernfalls geben Sie die Instanz zurück.
2 - Wenn der Wert 0 ist: Geben Sie den kritischen Bereich ein. Erstellen Sie das Objekt. Kritischen Bereich verlassen.
3 - Wäre es besser, dies zu tun, anstatt den gesamten Code innerhalb des Bereichs des kritischen Abschnitts einzubeziehen?