이번시간에는 멀티쓰레드 환경에서 공유 데이터를 사용 할 때의 문제점을 공부하게됐다.
Cf ) C++ 언어의 메모리 구조
CODE영역 : 기계어 형태의 코드가 저장되어 있는 영역
STACK영역 : 인수, 지역변수가 저장되는 영역
HEAP영역 : malloc 함수에 의해서 동적으로 할당 된 영역
데이터영역 : 스태틱, 전역 변수가 저장되는 영역
1) 코드의 break 포인트를 잡는다.
2) Windows 디버거 버튼을 누른다.
3) 디버거에서 디어셈블러로 어셈블리 언어를 볼 수 있다.
한 줄의 명령어는 어셈블리 언어로 바뀌면서 많은 줄의 명령어로 변경된다.
그렇기 때문에 멀티 쓰레드로 명령어를 실행 할 때, 같은 영역을 참조하게 되면 명령어가 뒤엉켜서 값이 잘 안나오게 된다.
atomic은 원자라는 뜻으로 더이상 쪼개지지 않는 단위를 의미한다.
이 C++에서 atomic도 같은 맥락에서 사용된다. 하나의 명령어를 여러 단계로 쪼개지 않고, 하나의 명령어로 실행한다는 의미이다.
그래서 atomic을 사용하게 되면 '++' 연산자의 경우 move, inc 등의 명령어로 동작하던 명령어를 'call' 명령어를 통해 한 번에 실행되는 서브루틴으로 들어가서 명령어를 실행한다.
병목 현상이 일어 날 수 있다.
일반적인 사용 방법은 아니다.
#include <atomic>
atomic<int32> sum
sum.fetch_add(1) 새롭게 알게된 함수, 라이브러리 및 템플릿
Cf) fetch_add 메소드는 atomic 전용 연산자 '++' 연산자를 사용해도 되긴한다.
Cf) DB에서도 atomic 개념을 사용한다. 교환을 예제로 들어 A라는 유저의 인벤토리에서 고근을 빼고, B라는 유저의 인벤토리에 고근을 추가 할 때, DB트랜잭션을 통하여 두개의 작업을 묶어서 한번에 atomic하게 일어나게 한다. 이를 통해 서버충격으로 인해서 다른 한명의 아이템이 사라졌는데, 다른 한 사람도 아이템을 가지고 있지 않는 그러한 문제가 야기하는 것을 막아준다.
과제 : C++ 템플릿 개념 정리해서 밑에 적기