개요

 

Interlocked 류 함수들은 멀티스레드 환경에서 long 타입, 포인터타입의 공유변수들의 단순한 처리(+1, -1,더하기, 대입, 비교대입) 에 있어서 함수 자체에서 스레드 안전을 보장한다. Interlocked 함수들의 내부처리는 Atomic Operation 으로 이뤄지며, Atomic Operation이 "interrupt 당하지 않는(같은 말 : 컨텍스트 전환 이 생기지 않는) 처리 "이므로 함수처리 완료시까지 다른 스레드의 침범을 받지 않게됨.

 

코드예를 보면, 아래 예1의 비안전 코드를 예2처럼 InterlockedIncrement 라는 함수 사용하는것 만으로도 전역변수 gCount 는 thread safety 해진다.

비교 : 아래 gCount++; 구간을 크리티컬 섹션(상세보기->http://igotit.tistory.com/545 )으로 지정해도 thread safety 가 달성되나 아래예제 코드가 훨씬 좋다.

long gCount=0; // 전역변수.

 

예1. 스레드 안전하지 않은 코드.

void ThreadFunc() // 스레드로 실행될 함수임.

{

 gCount++;

}

 

예2. 스레드안전한 코드.

void ThreadFunc() // 스레드로 실행될 함수임.

{

  InterlockedIncrement(&gCount); 

}

 

 

 

 

 

interlocked. 함수들 전체.

 

 

 함수

 인자

기능  

LONG InterlocakedIncrement

 LPLONG lpAppend

 인자로 전달된 것에 +1 한 값을 리턴.

LONG InterlockedDecrement

 LPLONG lpAppend

 인자로 전달된 것에 -1 한 값을 리턴.  

LONG InterlockedExchange

 LPLONG Target, LONG Value

 Value 를 *Target  에 대입.

리턴값 : *Target의 기존값.(Value대입이전의 값)

LONG InterlockedCompareExchange

  LPLONG Destination

, LONG Exchange

, Long Comperand

Comperand가 *Destination 과 같으면 Exchange를 *Destination 에 대입.

리턴값 : *Destination 의 기존값.

PVOID InterlockedExchangePointer

  PVOID *Target

, PVOID Value

**Target 에 Value 대입.

반환값 :  **Target 의 기존값.

LONG InterlockedExchangeAdd

  LPLONG Addend

, LONG value

 *Addend + value 를 리턴. 

PVOID InterlockedCompareExchangePointer

  PVOID *Destination

, PVOID Exchange

, PVOID Comperand

 Comperand가 *Destination 과 같으면 Exchange를 *Destination 에 대입.

리턴값 : *Destination 의 기존값.

 

 

 

 

 

 본 글이 포함된 상위 정리 장소.

 

 Visual Studio/VC++/C/C# 활용정리 -> http://igotit.tistory.com/11

 

 

///546

 

Posted by 리치굿맨

댓글을 달아 주세요