728x90

atomic 뜻 : https://grandstayner.tistory.com/entry/Automic-Operation%EC%9B%90%EC%9E%90%EC%A0%81-%EC%97%B0%EC%82%B0

 

용어 - Automic Operation(원자적 연산)

간단하게 말하면 중단이 불가능한 연산을 의미한다. 문제는 이를 얼마나 이해하는 것인데 자신이 작성한 코드가 원자적 연산이 아닐 수도 있다는 사실을 알아야 한다. 01: public class Example { 02:  i

grandstayner.tistory.com

 

신입 프로그래머들의 경우에는 위의 사진에서 7번 라인의 a++이 1개의 명령으로 실행이 된다고 생각할 수 있다.

하지만, 이것을 디스어셈블리 해보면 다음과 같이 여러개의 명령어로 실행이되는 것을 알 수 있다.

눈에 보이는 소스코드처럼 1번에 실행이 되는 것이 아니라면 Multi Thread 환경에서는 오동작을 일으킬 확률이 있기 때문에 C++ 11에서는 std::atomic 이라는 구조체를 제공하고 있다.

쉽게 설명하면 std::atomic의 템플릿 인자로 원자적으로 만들고 싶은 타입을 전달하면 그 변수는 기본적으로 원자적인 변수로 동작하게 바뀐다.

아래와 같이 atomic_int를 사용했을 때 디스어셈블리를 확인해보자.

위의 사진과 같이 lock xadd 라는 명령어가 보인다. 즉 lock을 걸어서 a++작업 자체를 원자적으로 동작하는 것을 보장해준다는 것이다.

 

사용법은 아래와 같이 단순하다.

#include <iostream>

int main()
{
    std::atomic<bool> boolean = false;
    boolean = true;
    boolean.store(true);
}

 

종종 사용되는 함수도 봐둘 필요는 있다.

#include <iostream>

std::atomic<bool> gStoppedThread = false;

void LoopThread()
{
    while (gStoppedThread == false)
    {

    }

    gStoppedThread = true;
}

만약 위와 같이 while(gStoppedThread = false)과 gStoppedThread = true 자체가 한번에 처리되어야 하는 상황이 있을 수 있다. 그럴 때는 atomic::compare_exchange_strong() 를 사용하면 된다.

변수 expected(기대값), desired(atomic 변수 값이 expected값과 같다면 이 값으로 적용) 가 추가되었다.

compare_exchange_strong()의 내부 동작은 의사 코드와 거의 동일할 것으로 예상된다.

즉 실제 코드와 같이 변경해주면 저 동작은 원자적으로 동작하는 것을 보장할 수 있다.

ref : https://aerocode.net/117

 

Compare And Exchange(CAS) 명령어

Compare And Exchange (CAS) Compare And Exchange (CAE) 명령어는 락을 사용하지 않는 기본 원자함수이며(CPU 레벨에서 지원한다.), 비교와 교환을 원자성을 가지고 수행한다. Compare And Swap (CAS) 라는 이름..

aerocode.net

 

728x90

'Basic Programming > C++ 11' 카테고리의 다른 글

C++11 - Mordern C++ 프로그래머를 위한 C++ 11/14 핵심  (0) 2018.10.17
c++11 - constexpr  (0) 2018.08.22
C++11 - final, override 키워드  (0) 2017.09.18
C++11 - std::thread  (0) 2016.12.02
C++11 - "default" and "delete" keyword  (0) 2016.11.29

+ Recent posts