티스토리 뷰

C++/General

Interlocked 계열 함수

엘키 2008. 1. 18. 10:38

간단한 동기 액세스를 행하기 위한 API

 복수의 스레드가 공유하는 변수에 대해서의 동기 액세스를 간단하게 실시하기 위한 함수가 제공되고 있습니다. 변수의 값을 갱신할 때에 한 번에 하나의 스레드 밖에 그 갱신을 실시하지 않는 것을 보증합니다.

1 InterlockedIncrement

 지정된 변수의 값을 인크리먼트(increment) 하고(하나 늘립니다), 그 결과 얻을 수 있던 값을 체크합니다.

                                         

LONG InterlockedIncrement(

   LPLONG lpAddend     // 인크리먼트(increment) 해야 할 변수

);

 

lpAddend

 

인크리먼트(increment) 되는 변수로의 포인터를 지정합니다.

반환 값

 

인크리먼트(increment) 후의 값이 돌아갑니다.

2 InterlockedDecrement

 지정된 변수의 값을 감소 하여(하나 줄입니다), 그 결과 얻을 수 있던 값을 체크합니다.

                                         

LONG InterlockedDecrement(

   LPLONG lpAddend     // 변수로의 포인터

);

 

lpAddend

 

감소 되는 변수로의 포인터를 지정합니다.

반환 값

 

감소 후의 값이 돌아갑니다.

3 InterlockedExchange

 지정된 변수의 내용과 또 하나의 값의 교환을 일괄 하여 실시합니다.

                                         

LONG InterlockedExchange(

   LPLONG Target,      // 교환에 사용되는 변수

   LONG Value          // 새로운 값

);

 

Target

 

값을 교환해야 할 변수로의 포인터를 지정합니다. 변수로부터 제어가 돌아가면 이 변수에 Value 파라미터로 지정한 값이 저장 됩니다.

Value Target

 

파라미터가 가리키는 변수에 저장해야 할 새로운 값을 지정합니다.

반환 값

 

Target 파라미터가 가리키는 변수의 교환 전의 값이 반환 됩니다.

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)에 대해 설명합니다.

5.1 Interlocked Singly Linked Lists

 Interlocked Singly Linked Lists(SLists)에 의해서 linked list로의 삽입과 삭제를 간단하게 행할 수 있습니다. non-blocking 알고리즘을 이용하여 리스트로의 액세스의 동기를 잡습니다.

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. Additional 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을 돌려줍니다.

Using Singly Linked Lists 

http://msdn.microsoft.com/en-us/library/ms686962(VS.85).aspx 


원문 : 흥배님 블로그
 http://blog.naver.com/jacking75)

'C++ > General' 카테고리의 다른 글

C++ Const 용법 정리  (4) 2008.01.31
오버로딩과 오버라이딩  (3) 2008.01.22
시간 관련 함수 모음  (0) 2008.01.17
오류의 원인  (0) 2008.01.14
윈도우 가상 키 코드(Virtual Key Code)테이블  (0) 2008.01.12
댓글