zoukankan      html  css  js  c++  java
  • .一个堆栈类的实现(原创)

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

    //堆栈的实现 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.
  • 相关阅读:
    设置IIS允许下载.config文件
    SQL Server 触发器
    MVC参数自动装配
    sql之left join、right join、inner join的区别
    C# 之泛型详解
    Frameset使用教程
    网页引用Font Awesome图标
    ubuntu下apache2 安装 配置 卸载 CGI设置 SSL设置
    深入理解JAVA I/O系列二:字节流详解
    深入理解JAVA I/O系列三:字符流详解
  • 原文地址:https://www.cnblogs.com/lwm8246/p/2756251.html
Copyright © 2011-2022 走看看