VisualStudio.C++.C#/코딩팁,함수활용,단편
Thread Safety (스레드 안전) Interlocked. 함수들.
i.got.it
2016. 1. 12. 20:39
|
개요 |
|
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 의 기존값. |
|
|
|
///546