검색 능력이 딸려서인지 구현된 소스는 못 찾았습니다. 하나 찾긴 했지만, 코드 스타일이 내가 원하는 상태가 아닌지라 ㅡ.ㅡ;;
간단하게 아래처럼 따로 구현해봤습니다. 구현이라고 할 것 까지는 ㅡ.ㅡ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 |