본문 바로가기

# 미사용

Fetch And Add(FAA) 명령어

Fetch And Add

Fetch And Add (FAA)  명령어는 락을 사용하지 않는 기본 원자함수이며(CPU 레벨에서 지원한다.), 

추출과 덧셈 연산을 원자성을 가지고 수행한다.


행동 정보

  • 이전 값을 반환하고,

  • 주어진 값 만큼 더한다.


인자 정보

  • value    : 더해지는 변수.

  • n         : 더해질 값.


반환 정보

  • 더해지기 이전의 값.  (덧셈 명령도 동시에 일어남.)


기본적인 구현은 다음과 같으며,

매커니즘을 설명하기 위한 것 뿐이지 실제로 적용가능한 함수는 아니다.


위의 동작은 후위 연산자 n++  와 같다.


Usage

이 함수는 공유자원의 덧셈이 원자성을 가져야 할 때 사용된다.

가장 간단한 예로는 카운터가 있다.


C++11 Standard

fetch_add  함수는 C++11에서 추가되었으며,

원자계 프리미티브 타입인 atomic<T>  에서 멤버 메소드로 구현되었다.



Concurrent Example(1) : Thread-Safe Counter

먼저 쓰레드에 안전하지 않은 버전부터 살펴보자.


10000  개의 쓰레드가 하나의 카운터에 대하여 개별적으로 10000  번씩 증가시킬 것 이다.  

그러므로 카운터의 최종값은 10000 * 10000  이 되어야 한다.



원하지 않은 값이 나온 이유는 명백하고 단순하다.

같은 값에 대해 v+=1  을 수행한 쓰레드 쌍이 존재하기 때문이다.


예를 들어 v = 100  인 상태에서,

이미 다른 쓰레드에 의해 v = 101  으로 갱신되었음에도 불구하고,

v = 101  로 갱신하려는 쓰레드가 있었기에 발생한 것 이다.


이 문제를 해결할 수 있는 키 포인트는 간단하다.

덧셈이 원자성을 가지면 된다.


다음은 위의 키 포인트를 적용하여 작성한 쓰레드에 안전한 버전이다.