Atomic

원래벌레·2022년 4월 2일
0

이번시간에는 멀티쓰레드 환경에서 공유 데이터를 사용 할 때의 문제점을 공부하게됐다.

Cf ) C++ 언어의 메모리 구조

CODE영역 : 기계어 형태의 코드가 저장되어 있는 영역

STACK영역 : 인수, 지역변수가 저장되는 영역

HEAP영역 : malloc 함수에 의해서 동적으로 할당 된 영역

데이터영역 : 스태틱, 전역 변수가 저장되는 영역

💍 어셈블리언어를 보는 방법

1) 코드의 break 포인트를 잡는다.
2) Windows 디버거 버튼을 누른다.
3) 디버거에서 디어셈블러로 어셈블리 언어를 볼 수 있다.

💍 동기화가 안 된 변수에서의 멀티쓰레드 환경

  • 한 줄의 명령어는 어셈블리 언어로 바뀌면서 많은 줄의 명령어로 변경된다.

  • 그렇기 때문에 멀티 쓰레드로 명령어를 실행 할 때, 같은 영역을 참조하게 되면 명령어가 뒤엉켜서 값이 잘 안나오게 된다.

💍 첫번째 동기화 방법 : atomic

  • atomic은 원자라는 뜻으로 더이상 쪼개지지 않는 단위를 의미한다.

  • 이 C++에서 atomic도 같은 맥락에서 사용된다. 하나의 명령어를 여러 단계로 쪼개지 않고, 하나의 명령어로 실행한다는 의미이다.

  • 그래서 atomic을 사용하게 되면 '++' 연산자의 경우 move, inc 등의 명령어로 동작하던 명령어를 'call' 명령어를 통해 한 번에 실행되는 서브루틴으로 들어가서 명령어를 실행한다.

💍 atomic의 단점 :

  • 병목 현상이 일어 날 수 있다.

  • 일반적인 사용 방법은 아니다.


#include <atomic>

atomic<int32> sum

sum.fetch_add(1)                   새롭게 알게된 함수, 라이브러리 및 템플릿

Cf) fetch_add 메소드는 atomic 전용 연산자 '++' 연산자를 사용해도 되긴한다.

Cf) DB에서도 atomic 개념을 사용한다. 교환을 예제로 들어 A라는 유저의 인벤토리에서 고근을 빼고, B라는 유저의 인벤토리에 고근을 추가 할 때, DB트랜잭션을 통하여 두개의 작업을 묶어서 한번에 atomic하게 일어나게 한다. 이를 통해 서버충격으로 인해서 다른 한명의 아이템이 사라졌는데, 다른 한 사람도 아이템을 가지고 있지 않는 그러한 문제가 야기하는 것을 막아준다.

과제 : C++ 템플릿 개념 정리해서 밑에 적기

profile
학습한 내용을 담은 블로그 입니다.

0개의 댓글