.一个堆栈类的实现(原创)

模拟堆栈的实现,线程安全,速度快,开销小

//堆栈的实现 2012-11-04

unit sfStacks;

interface
{$DEFINE MULTI_THREAD_QUEUE} //线程安全版本
{$IFDEF MULTI_THREAD_QUEUE}
uses
    Windows;
{$ENDIF}
type
  TsfStack=class
  private
    FStackSize:Integer;
    FBuff:Pointer;
  {$IFDEF MULTI_THREAD_QUEUE}
    FCS:TRTLCriticalSection;
  {$ENDIF}
    FPosition:Integer;
  protected
    procedure Lock();
    procedure UnLock();
  public
    constructor Create(StackSize:Integer=1024);
    destructor  Destroy();override;
    //\\
    function Push(AItem: Pointer): Integer;virtual;
    function Pop(): Pointer;virtual;
  public
    property Size:Integer read FStackSize;
    property Position:Integer read FPosition;
  end;

implementation
{ TsfQueue }
constructor TsfStack.Create(StackSize:Integer);
begin
  {$IFDEF MULTI_THREAD_QUEUE}
     InitializeCriticalSection(FCS);
  {$ENDIF}
  if StackSize < 1024 then StackSize := 1024;
  GetMem(FBuff,StackSize * 4);
  ZeroMemory(FBuff,StackSize * 4);
  FStackSize := StackSize;
  FPosition := 0;
end;
destructor TsfStack.Destroy;
begin
  FreeMem(FBuff);
  //\\
  {$IFDEF MULTI_THREAD_QUEUE}
     DeleteCriticalSection(FCS);
  {$ENDIF}
  inherited;
end;
procedure TsfStack.Lock;
begin
  {$IFDEF MULTI_THREAD_QUEUE}
     EnterCriticalSection(FCS);
  {$ENDIF}
end;
procedure TsfStack.UnLock;
begin
  {$IFDEF MULTI_THREAD_QUEUE}
      LeaveCriticalSection(FCS);
  {$ENDIF}
end;

function TsfStack.Pop: Pointer;
var
  P:PInteger;
begin
  Lock();
  try
    if Position > 0 then
    begin
      P := FBuff;
      Dec(FPosition);
      Inc(P,FPosition);
      Result := Pointer(P^);
    end
    else
      Result := nil;
  finally
    UnLock();
  end;
end;
function TsfStack.Push(AItem: Pointer): Integer;
var
  P:PInteger;
begin
  Lock();
  try
    if Position <= Size - 1 then
    begin
      P := FBuff;
      Inc(P,Position);
      P^ := Integer(AItem);
      Inc(FPosition);
      Result := Position;
    end
    else
      Result := -1;
  finally
    UnLock();
  end;
end;
end.

 

posted on 2012-11-06 01:36  歼10  阅读(579)  评论(0编辑  收藏  举报

导航