Эквир Синглтон класс Экземпляр Многопоточность
Чтобы получить экземпляр класса с шаблоном Singleton, я хочу использовать следующую функцию:
Это эскиз
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.
Три вопроса:
1- Является ли этот дизайн Резьба Безопасной? Особенно с InterlockedExchange Part.
2- Как использовать InterlockedCompareExchange? Можно ли делать то, что яя пытаюсь?
3- Является ли этот дизайн лучше, чем задействовать весь код в области критического раздела?
Замечание: Мой объект является потокобезопасным, только конструкция, которую мне нужно сериализовать!
Это не интимный код, а только важная часть, я имею в виду, функция getInstance.
НЕОБХОДИМОСТЬ использовать какой-то одноэлементный объект.
Есть ли способ использовать InterlockedCompareExchange для сравнения, если значение InstanceNumber равно нулю?
А также
1 - Создайте объект только когда 0, иначе верните экземпляр.
2 - Когда значение равно 0: введите в критическом разделе. Создать объект. Оставьте критический раздел.
3 - Было бы лучше сделать это, вместо того, чтобы включать весь код в область критического раздела?