InterlockedIncrement(), InterlockedDecrement()

반응형

상호잠금 함수(interlocked function)들은 다른 동기화 방법들에 비해 간단하고 빠르며
스레드를 차단하지도 않는다는 장점을 가지고 있다.
Windows 의 상호잠금 함수는 InterlockedIncrement() 와 InterlockedDecrement() 이다.
이들은 32비트 부호 있는 정수들에 적용된다. 

상호잠금 함수를 사용할 때, 주의할 점은 아래와 같다. 

* InterlockedIncrement 함수를 호출한 쓰레드가 N 의 새 값을 사용하기 전에 다른 쓰레드가 N 의 값을 변경할 가능성이 존재한다.

* N 을 2 증가하기 위해서 InterlockedIncrement 함수를 연달아 두 번 호출하는 것은 위험하다. 이는 그 두 호출 사이에 다른 스레드가 실행될 가능성이 존재하기 때문이다. -> InterlockedExchangeAdd 함수를 사용하여 한다.

"어떤 함수 조건 없이 뭉치를 하나의 블럭처럼 사용하게 하는 것은
EnterCriticalSection ~ LeaveCriticalSection 인데"

라고 했는데, critical section은 님이 말하는 그런 게 아니라, synchronize를 하는 겁니다. mutex와 같은 기능이지만, 더 빠르고 메모리를 작게 차지하는 대신, 한 프로세스 내에서만 쓸 수 있는 것이지요. unix에서는 mutex는 있지만, critical section과 같은 건 없습니다.

 

InterlockedIncrement()등의 함수는 위의 일반적인 synchronize를 많이 쓰는 패턴에 대해서 더 간단하게 쓸 수 있게하는 거지요. critical section의 예를 들면, CRITICAL_SECTION변수를 잡아줘야하고, Initialize...(), Delete...()이 필요하며, 변수 바꾸기 전후에 항상 Enter...()와  Leave...()를 해야 합니다. 이걸 한 큐에 할 수 있게 하는 거죠.

 

또 하나 차이점은 Interlocked*()들은 다른 프로세스이지만 변수가 shared memory object라면(CreateFileMapping()등으로 만든) mutex처럼 다른 프로세스들 간의 동기화에 쓸 수 있습니다.

 

그리고, 님이 끝에 말한

"한 예로 증가 또는 감소하는 64bit 변수가 있다면 이게
어떤 결과값에 따라 커지게 혹은 작아지게 업데이트되는 것을 의미하는 건가요?

숫자의 크기가 증가 혹은 감소하는 부분들을 다른 쓰레드가 건드리지 말라고
하는 겁니까? "

이건 대충 맞는 말입니다.

 

좀 더 정확히 말하자면, InterlockedIncrement()의 경우, 한 쓰레드가 변수를 증가시키는 동안에 다른 쓰레드가 끼어 들지 않게 해서, 진짜 원하는 대로 1만 증가하도록 하는 것이죠.

 

사실 별 필요없어 보이지만, 종종 필요한 때가 있습니다. 예를 들면, 공통으로 쓰는 object의 reference count를 변화시키고 그 값에 따라 object를 release하거나 새로 생성할 때 이지요.

 



http://blog.naver.com/websearch/70027261346
http://blog.naver.com/ck2347/50026036147

TAGS.

Comments