我是否可以将TCriticalSection
对象声明为公共字段,例如:
type
TMyObject = class
public
CS: TCriticalSection;
end;
我想公开该字段以允许任何线程进入和离开临界区对象,这在内部保护TMyObject
实例的完整性。那么,我可以将TCriticalSection
对象声明为公共类字段吗?
答案 0 :(得分:9)
简单的答案是肯定的。一个类的字段是保持TCriticalSection
的完全正常的地方。
为了使关键部分能够序列化对共享资源的访问,所有线程必须引用关键部分的同一实例。因此,根据这一事实,您可以得出结论,您需要确保所有线程都引用该类的相同实例。然后当他们读取该类的关键部分字段时,所有线程都访问关键部分的同一个实例。
宣布公共领域通常被认为是不好的做法。您通常会通过属性或类的方法来公开这样的事情。
答案 1 :(得分:4)
这是我过去为实现这一目标所做的事情:
TMyObject = class(TObject)
private
FCS :TCriticalSection;
FMyProp :string;
function GetMyProp :string;
procedure SetMyProp( const NewValue :string );
protected
public
constructor Create;
destructor Destroy; override;
// properties
property MyProp :string read GetMyProp write SetMyProp;
end;
接下来是实施:
constructor TMyObject.Create;
begin
inherited Create;
FCS := TCriticalSection.Create;
FMyProp := '';
end;
destructor TMyObject.Destroy;
begin
FCS.Free;
inherited Destroy;
end;
function TMyObject.GetMyProp :string;
begin
FCS.Enter;
try
result := FMyProp;
finally
FCS.Leave;
end;
end;
procedure TMyObject.SetMyProp( const NewValue :string );
begin
FCS.Enter;
try
FMyProp := NewValue;
finally
FCS.Leave;
end;
end;
请注意,我没有公开FCS字段。