상세 컨텐츠

본문 제목

Interlocked Singly Linked Lists for Delphi

프로그래밍/Delphi

by ryujt 2012. 10. 19. 17:48

본문

검색 능력이 딸려서인지 구현된 소스는 못 찾았습니다.  하나 찾긴 했지만, 코드 스타일이 내가 원하는 상태가 아닌지라 ㅡ.ㅡ;;


간단하게 아래처럼 따로 구현해봤습니다.  구현이라고 할 것 까지는 ㅡ.ㅡ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;




관련글 더보기