About Interlocked
About Interlocked
복수의 스레드가 공유하는 변수에 대해서 동기 액세스를 간단하게 실시하기 위한 함수가 제공되고 있습니다. 변수의 값을 갱신할 때에 한 번에 하나의 스레드만 변경하는 것을 보증합니다.
3.8.1 InterlockedIncrement
지정된 변수의 값을 증가 시킵니다(increment)(하나늘립니다).
LONG InterlockedIncrement( LPLONG lpAddend // 인크리먼트(increment) 해야 할 변수 ); |
lpAddend | |
인크리먼트(increment) 되는 변수의 포인터를 지정합니다. | |
반환 값 | |
인크리먼트(increment) 후의 값이 반환됩니다. |
3.8.2 InterlockedDecrement
지정된 변수의 값을 감소 시킵니다(하나 줄입니다).
LONG InterlockedDecrement( LPLONG lpAddend // 변수의 포인터 ); |
lpAddend | |
감소 되는 변수의 포인터를 지정합니다. | |
반환 값 | |
감소 후의 값이 반환됩니다. |
3.8.3 InterlockedExchange
지정된 변수의 내용과 또 하나의 값의 교환을 일괄하여 실시합니다.
LONG InterlockedExchange( LPLONG Target, // 교환에 사용되는 변수 LONG Value // 새로운 값 ); |
Target | |
값을 교환해야 할 변수의 포인터를 지정합니다. 변수로부터 제어가 돌아가면 이 변수에 Value 파라미터로 지정한 값이저장됩니다. | |
Value Target | |
파라미터가 가리키는 변수에 저장해야 할 새로운 값을 지정합니다. | |
반환 값 | |
Target 파라미터가 가리키는 변수의 교환 전의 값이 반환됩니다. |
3.8.4 InterlockedExchangeAdd
가수(加数) 변수의 증분 값의 동기화 덧셈을 실행합니다.
LONG InterlockedExchangeAdd ( PLONG Addend, // 가수의 포인터 LONG Increment // 증분 값 ); |
Addend | |
가수가 들어간 변수의 포인터를 지정합니다.이 값에 Increment가 가산됩니다. | |
Increment | |
Addend가 가리키는 변수에 가산하는 수를 지정합니다. | |
반환 값 | |
Addend가 가리키는 변수의 가산 전의 값이 반환됩니다. |
5 Experiment 4: Non-blocking Data Structures
이 장에서는 Interlocked Singly Linked Lists(SLists)에 대해 설명합니다. |
SList의 헤더 형은SLIST HEADER입니다. SList의 엔트리의 형태는 SLIST ENTRY입니다. | |
InitializeSListHead 함수에 의해서SList를 초기화 합니다. | |
InterlockedPushEntrySList 함수에 의해서 SList에 항목을 삽입합니다. | |
InterlockedPopEntrySList 함수에 의해서 SList로부터 항목을 삭제합니다. |
아래는 샘플 프로그램입니다. InitializeSListHead 함수에 의해서 SList를 초기화하고InterlockedPushEntrySList 함수에 의해서 항목을 10개 삽입합니다. InterlockedPopEntrySList 함수에 의해서 항목을10개 없앱니다. 그리고 InterlockedFlushSList 함수에 의해서 리스트가 빈 것임을 확인합니다.
#include
#include
// Structure to be used for a list item. Typically, the first member
// is of type SLIST_ENTRY. Additio nal members are used for data.
// Here, the data is simply a signature for testing purposes.
typedef struct _PROGRAM_ITEM {
SLIST_ENTRY ItemEntry;
ULONG Signature;
} PROGRAM_ITEM, *PPROGRAM_ITEM;
void main( )
{
ULONG Count;
PSLIST_ENTRY FirstEntry, ListEntry;
SLIST_HEADER ListHead;
PPROGRAM_ITEM ProgramItem;
// Initialize the list header.
InitializeSListHead(&ListHead);
// Insert 10 items into the list.
for( Count = 1; Count <= 10; Count += 1 )
{
ProgramItem = (PPROGRAM_ITEM)malloc(sizeof(*ProgramItem));
ProgramItem->Signature = Count;
FirstEntry = InterlockedPushEntrySList(&ListHead,
&ProgramItem->ItemEntry);
}
// Remove 10 items from the list.
for( Count = 10; Count >= 1; Count -= 1 )
//
{
ListEntry = InterlockedPopEntrySList(&ListHead);
free(ListEntry);
} Flush the list and verify that the items are gone.
ListEntry = InterlockedFlushSList(&ListHead);
FirstEntry = InterlockedPopEntrySList(&ListHead);
if (FirstEntry != NULL)
{
printf("Error: List is not empty.");
}
}
5.1.1 InitializeSListHead
SList의 헤더를 초기화합니다.
void InitializeSListHead(
PSLIST_HEADER ListHead
);
ListHead | |
SList의 헤더를 가리키는 SLIST_HEADER 구조체의 포인터. |
5.1.2 InterlockedPushEntrySList
SList의 선두에 항목을 추가합니다. 이 리스트의 액세스는 동기가 취해집니다.
PSLIST_ENTRY InterlockedPushEntrySList(
PSLIST_HEADER ListHead,
PSLIST_ENTRY ListEntry
);
ListHead | |
SList의 헤더를 가리키는 SLIST_HEADER 구조체의 포인터. | |
ListEntry | |
Push 하는 SLIST_ENTRY 구조체의 포인터. | |
반환값 | |
함수 실행전의 리스트의 선두 항목을 돌려줍니다. 만약 실행 전에 리스트가 비었다면 NULL을 돌려줍니다. |
5.1.3 InterlockedPopEntrySList
SList의 선두로부터 항목을 꺼냅니다. 이 리스트 로의 액세스는 동기가 취해집니다.
PSLIST_ENTRY InterlockedPopEntrySList(
PSLIST_HEADER ListHead
);
ListHead | |
SList의 헤더를 가리키는SLIST_HEADER 구조체 로의 포인터. | |
반환값 | |
리스트로부터 제거된 항목의 포인터를 돌려줍니다. 만약 리스트가 빈 것이라면 NULL을 돌려줍니다. |
출처 : http://www.i.u-tokyo.ac.jp/edu/training/ss/lecture/material/thread/index.html
'Study > C++' 카테고리의 다른 글
EC++ 3. const의 사용 (0) | 2009.08.28 |
---|---|
pragma 정리 (0) | 2009.08.01 |
메모리 관리 (0) | 2009.07.31 |
호출규약 (0) | 2009.07.31 |
pascall stdcall cdecl (0) | 2009.07.31 |