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.
  • 相关阅读:
    转载——关于scanf造成死循环
    转载——关于C#延时
    2013.02.13——笔记
    最近计划
    关于毕业设计——2013.4.12
    关于c#中combobox赋值问题
    使用DWE编辑对话框窗体
    Insert New Class (a2BusNew under BusItem)
    将TCE链接加入新工作通知(NewWorkAssignment,Sig)邮件中
    创建Relation并Add到数据库
  • 原文地址:https://www.cnblogs.com/lwm8246/p/2756251.html
Copyright © 2011-2022 走看看