模拟堆栈的实现,线程安全,速度快,开销小
//堆栈的实现 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.