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

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




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


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. 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

이 글은 스프링노트에서 작성되었습니다.

신고
by 흥배 2009.05.07 12:31
| 1 |