이번에 소개할것은 Windows에 존재하는 Singly Linked List 입니다.



이 리스트는 Interlocked 계열을 사용한 리스트로서 멀티 프로세서환경에서 다른 동기화 시스템이 필요없다.



!! 여기까지 들으면 와 ~ 할 정도지만. 단점이. 크리티컬한 단점이 존재한다.



1.  singly linked list 는 push 와 pop 만이 존재한다. 리스트의 장점인 중간 삽입, 삭제가 불가능하다.


2.  singly linked list 는 Queue 가 아닌 Stack 으로 만들어졌다. (LIFO) 흑흑


 


그래도 사용할 만한곳을 찾았으니. 그건 안가르쳐주고 나혼자 써먹을거당. (은 아니고. 개발후 공개를 해야지)


 


관련 API를 알려드리겠습니다.


 


. 초기화



void InitializeSListHead( PSLIST_HEADER ListHead );


. Push



PSLIST_ENTRY InterlockedPushEntrySList( PSLIST_HEADER ListHead, PSLIST_ENTRY ListEntry );


. Pop



PSLIST_ENTRY InterlockedPopEntrySList( PSLIST_HEADER ListHead );


. Flush



PSLIST_ENTRY InterlockedFlushSList( PSLIST_HEADER ListHead );


. 기타



USHORT QueryDepthSList( PSLIST_HEADER ListHead );


(해당 ListHead 의 원소 개수를 반환해준다. 그런데 왜 하필 USHORT 인가.. 65535개 이상인경우 어떻게 확인하라고. ㅠㅠ)


API 설명은 우리의 친절한 MSDN 님에게 알아들 보시구요. 샘플 소스 코드 나갑니다. (MSDN에도 있습니다. 단, 제 소스랑 다릅니다.)


 



사용자 삽입 이미지
<소스 코드>



사용자 삽입 이미지
<결과 화면>


 


설명이 필요한가요? 소스만 봐도 감이 오지 않으신가요? 간단한 설명을 드리자면


 



1. 하나의 singly linked list 에 연결된 SLIST_HEADER 라는 구조체가 필요합니다


2. 우리가 사용하고자는 자료구조는 SLIST_ENTRY 를 상속받거나 최상단에 포함하고 있어야합니다.


3. InterlockedPopEntrySList 함수는 리스트가 비어있는경우 NULL 을 리턴합니다.


위 세가지만 기억하시면 사용하시는데 그리 불편함 OR 삽질은 하시지 않으실겁니다.


 


이젠 위 소스 코드에 등장하지 않은 함수에 대해 알아보겠습니다.


 



사용자 삽입 이미지
<소스 코드>



사용자 삽입 이미지
<결과 화면>


 


QueryDepthSList 는 위에서 설명이 되어있습니다. 리스트 원소 개수를 알려주는 함수이지요. (리턴되는 타입이 USHORT라서 쉣이지만요.ㅠㅠ)


InterlockedFlushSList 함수를 실행하면 PSINGLE_LIST_ENTRY 변수에 해당 리스트의 헤더 정보가 들어갑니다. 그 후 PSINGLE_LIST_ENTRY  Next가 NULL 일때까지 파고들면 모든 원소에 액세스가 가능합니다.


 


 주의할 점은 Flush 이 후 SLIST_HEADER 의 리스트는 아무것도 가지고 있지 않다는점만 기억하시면 됩니다.

Post to Twitter