1

私のアプリケーションはモノスレッドでしたが、今ではパフォーマンスを向上させるためにマルチスレッドにする必要があります。

次のアーキテクチャに List と ListItem があります。

TBListItem = class(TBusinessObjects)
private 
  FList : TBList;
protected
  //methods
public 
  constructor Create(AList: TBList); reintroduce;
  //other methods
  //properties... 
end;

継承の代わりに、リストの構成を優先します。

TBList = class(TPersistent)
private 
  FItemClass : TBListItemClass; //class of TBListItem

  //this is used to AddObject(key, object) of the TStringList duplicates are no allowed   
  function  BuildKey(ArrayOfKeys: array of Variant): string;
protected
  //we use a stringlist to save the items
  FList: TStringList; 

  function  GetItem(Index: Integer): TBListItem;
  //methods like Load(); Unload(); Save();
public 
  constructor Create(ARefClassItem: TBListItemClass); reintroduce;

  //these methods use buildkey
  function Add(ArrayOfKeys: Array of Variant): TBListItem; reintroduce;
  function FindByKey(const ArrayOfKeys: array of Variant): TBListItem;

  //other methods
  //properties... 
end;

ADD() メソッドで次のようにします。

var Index: Integer;
begin   
  Index:= FList.IndexOf(BuildKey(ArrayOfKeys));    
  if Index <> -1 then
    Result:= TBListItem(FList.Objects[Index])
  else 
  begin        
    Result:= FListItemClass.Create(Self);
    Result.FCodigo:= ArrayOfKeys;
    //load data from database.
    FList.AddObject(BuildKey(ArrayOfKeys), Result)
  end;    
end;

前述したように、このオブジェクトは実行時にキャッシュ データを記録するために使用されますが、オブジェクトを読み書きする必要があるたびに、次のことを行う必要があります。

EnterCriticalSection(instance of TRTLCriticalSection);
//Do Stuff
LeaveCriticalSection(Same instance);

そこから継承したクラスが無数にあるため、アーキテクチャを大きく変更することはできません。
プロセスを実行すると、プロセッサのグラフィックに多くのスパイクが発生し、多くのダウンタイムも発生します。
システムは Delphi 6 コンパイラからコンパイルされます。
クリティカル セッションは、ユニットの初期化で作成されました。

これを行う別の方法はありますか?
少なくとも読み取りをロックしないでください。

また、整合性を保証する必要があり、同じキーを持つ 2 つのオブジェクトは許可されません。

4

1 に答える 1

3

読み取り時に同期を実行する必要があります。あるスレッドがデータ構造を変更している間に、別のスレッドがそれを読み取ろうとすることはできません。一般的なアプローチは、単一のライター、複数のリーダーをロックすることです。

Delphi には、これらのうちの 1 つ、つまり が付属していますTMultiReadExclusiveWriteSynchronizer。しかし、私はそのパフォーマンスが貧弱であると信じており、大失敗以来、TMonitor個人的には Emba のエンジニアが正しい同期プリミティブを作成する能力をほとんど信頼していません。

Vista で導入されたスリム リーダー/ライター (SRW) ロックを使用することをお勧めします。それでも XP をサポートする必要がある場合は、クリティカル セクションに戻ることをお勧めします。

于 2013-02-20T13:53:28.270 に答える