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

本文介绍了一种基于Pascal的线程安全堆栈实现方式,该实现利用了临界区来确保多线程环境下的安全性,并且具备较快的速度与较小的内存开销。文章详细展示了如何创建和销毁堆栈,以及核心的入栈和出栈操作。

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

//堆栈的实现 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.

 

转载于:https://www.cnblogs.com/lwm8246/archive/2012/11/06/2756251.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值