신입 프로그래머들의 경우에는 위의 사진에서 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
'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 |