我可以将TCriticalSection对象声明为公共类字段吗?

时间:2013-11-29 15:47:34

标签: delphi critical-section

我是否可以将TCriticalSection对象声明为公共字段,例如:

type
  TMyObject = class
  public
    CS: TCriticalSection;
  end;

我想公开该字段以允许任何线程进入和离开临界区对象,这在内部保护TMyObject实例的完整性。那么,我可以将TCriticalSection对象声明为公共类字段吗?

2 个答案:

答案 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字段。