要使用单例模式获取类的实例,我想使用以下函数:
这是草图
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 的部分。
2- 如何使用 InterlockedCompareExchange?有可能做我正在尝试的事情吗?
3- 这种设计是否比包含关键部分范围内的所有代码更好?
备注:我的对象是线程安全的,只有我需要序列化的构造!
这不是内部代码,只是重要的部分,我的意思是 getInstance 函数。
编辑
我需要使用某种单例对象。
如果 InstanceNumber 的值为零,有什么方法可以使用 InterlockedCompareExchange 进行比较?
And
1 - 仅当为 0 时才创建对象,否则返回实例。
2 - 当值为 0 时:进入临界区。创建对象。离开临界区。
3 - 这样做会更好,而不是涉及关键部分范围内的所有代码?