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 로 갱신하려는 쓰레드가 있었기에 발생한 것 이다.
이 문제를 해결할 수 있는 키 포인트는 간단하다.
덧셈이 원자성을 가지면 된다.
다음은 위의 키 포인트를 적용하여 작성한 쓰레드에 안전한 버전이다.
'# 미사용' 카테고리의 다른 글
[백준 1011] Fly me to the Alpha Centauri 통찰노트 (0) | 2018.10.22 |
---|---|
티스토리 깃허브 연동하기 (0) | 2018.10.21 |
Compare And Exchange(CAS) 명령어 (0) | 2018.10.14 |
Test And Set(TAS) 명령어 (0) | 2018.10.12 |
그림으로 알아보는 버킷 정렬 (bucket sort) (0) | 2018.10.01 |