검색 능력이 딸려서인지 구현된 소스는 못 찾았습니다. 하나 찾긴 했지만, 코드 스타일이 내가 원하는 상태가 아닌지라 ㅡ.ㅡ;;
간단하게 아래처럼 따로 구현해봤습니다. 구현이라고 할 것 까지는 ㅡ.ㅡa
소스 설명은 워낙에 간단해서 따로 드릴 필요를 으흠.. 그냥 스택이라고 생각하시면 됩니다.
Interlocked 함수를 이용해서 구현 된 것이라, 멀티 스레드 상황에서 임계영역으로 자원을 Block하지 않고 사용하여 퍼포먼스에 이득이 있습니다. 그 이외에는 그냥 무시하시면 되시겠습니다 ^^;
type TSLIST_HEADER = record case integer of 0 : (Alignment : int64); 1 : ( Next : pointer; Depth : word; Sequence : word; ) end; PSLIST_HEADER = ^TSLIST_HEADER; TSLIST_ENTRY = record NextEntry : pointer; MyData : integer; end; PSLIST_ENTRY = ^TSLIST_ENTRY; procedure InitializeSListHead(AHeader:pointer); stdcall; external kernel32; function InterlockedFlushSList(AHeader:pointer):pointer; stdcall; external kernel32; function InterlockedPopEntrySList(AHeader:pointer):pointer; stdcall; external kernel32; function InterlockedPushEntrySList(AHeader,AEntry:pointer):pointer; stdcall; external kernel32; function QueryDepthSList(AHeader:pointer):Word; stdcall; external kernel32; procedure TfmMain.FormCreate(Sender: TObject); var pHeader : PSLIST_HEADER; pEntry : PSLIST_ENTRY; Loop: Integer; begin New(pHeader); InitializeSListHead(pHeader); for Loop := 1 to 10 do begin New(pEntry); pEntry^.MyData := Loop; InterlockedPushEntrySList(pHeader, pEntry); end; moMsg.Lines.Add(Format('After InterlockedPushEntrySList: QueryDepthSList=%d'#13#10, [QueryDepthSList(pHeader)])); for Loop := 1 to 10 do begin pEntry := InterlockedPopEntrySList(pHeader); moMsg.Lines.Add(Format('InterlockedPopEntrySList: %d', [pEntry^.MyData])); Dispose(pEntry); end; moMsg.Lines.Add(Format('After InterlockedPopEntrySList: QueryDepthSList=%d'#13#10, [QueryDepthSList(pHeader)])); Dispose(pHeader); end;
델파이에서 에어로 끄고 켜기 (0) | 2013.01.05 |
---|---|
익명 메소드를 이용한 Iteration 구현 (0) | 2012.11.19 |
Real Grid Plus - 리얼 그리드가 새제품으로 출시된다고 합니다. (0) | 2012.09.07 |
오브젝트 파스칼 책을 찾는 분들에게 (2) | 2012.09.05 |
TIdHTTP 현재 받은 패킷 단위로 처리하고 싶을 때 (0) | 2012.09.02 |