SList를 사용해서 Object Pool을 구현해 보려고 한다.
구현에 앞서 SList에 대해 알아보자
Interlocked Singly linked list(SList)
MS에서 제공하는 연결 리스트로 atomic operation을 지원한다.
모든 항목은 MEMORY_ALLOCATION_ALIGNMENT boundary에 정렬되어야 한다.
정렬되지 않은 항목은 예측할 수 없는 결과를 초래할 수 있다고 한다.
따라서, 할당시 _aligned_malloc을 사용해야 한다.
SList의 헤더는 SLIST_HEADER, 엔트리는 SLIST_ENTRY 타입이다.
SLIST_HEADER
SList의 헤더로, 맨 처음에 위치한 아이템을 가리킨다.
depth는 SList에 포함된 데이터의 개수를 의미한다.
sequece는 리스트에서 데이터를 Pop할 때 1 증가, Push할 때 1 감소하며 값이 계속 변화한다.
typedef struct SLIST_HEADER
{
union
{
UINT64 alignment;
struct
{
SINGLE_LIST_ENTRY next;
WORD depth;
WORD sequence;
};
};
};
SLIST_ENTRY
SList의 아이템을 나타낸다.
Next는 리스트에서 다음에 위치한 아이템을 가리키는 포인터다.
typedef struct SLIST_ENTRY
{
struct SLIST_ENTRY* Next;
}
SList Method
SList에서 사용할 수 있는 함수들은 다음과 같다.
- InitializeSListHead : 헤드를 초기화한다.
- InterlockedFulshSList : 리스트의 전체 항목을 flush한다.
- InterlockedPopEntrySList : 리스트의 맨 앞에 위치한 아이템을 제거한다.
- InterlockedPushEntrySList : 리스트의 맨 앞에 아이템을 삽입한다.
- InterlockedPushListSList : 리스트의 앞에 다른 리스트를 삽입한다.
- InterlockedPushListSListEx : 리스트의 앞에 다른 리스트를 삽입하는데, _fastcall 호출 규칙을 사용하지 않음
- RtlFirstEntrySList : 리스트에서 첫 번째 아이템을 검색한다.
- QueryDepthSList : 리스트에 포함된 아이템 수를 검색한다.
출처
https://learn.microsoft.com/en-us/windows/win32/sync/interlocked-singly-linked-lists
Interlocked Singly Linked Lists - Win32 apps
An interlocked singly linked list (SList) eases the task of insertion and deletion from a linked list.
learn.microsoft.com
'Server > Multithreading' 카테고리의 다른 글
[Object Pool] SList를 사용한 Object Pool 구현(2) (0) | 2023.05.26 |
---|