SW/C++

[ C++ ] atomic 개념 및 예제

얇은생각 2018. 11. 16. 14:57
반응형

뮤텍스를 통해서 전역 변수를 동기화하여 하나씩 증가시킬 수 있습니다. 그러나 일반적으로 뮤텍스와 같은 lock을 이용하여 개발하는 경우, 사용자가 잘못 사용할 때 교착 상태와 같은 문제를 야기시킬 수 있습니다. 그러므로 주의 깊게 사용해야 합니다. C++11에서는 atomic을 이용하여 뮤텍스와 같이 lock, unlock을 사용하지 않고 값을 증가시키거나 값을 감소시킬 수 있는 기능을 제공하고 있습니다. 


atomic  : atomic 변수를 선언할 수 있는 데이터형이다.

fetch_add : atomic의 멤버 함수로, 값을 증가시키는 함수입니다.

fetch_sub : atomic의 멤버 함수로, 값을 감소시키는 함수입니다. 


aomic으로 설정된 변수에는 초기에만 값을 대입할 수 있습니다.  그 이외에는 대입이 불가합니다. 대신 값을 증가, 감소 시키는 역할만 수행합니다. 그 이유는 atomic으로 선언된 변수를 이용해 어떤 동작을 하는 중에는 다른 스레드들이 해당 atomic 변수를 절대 사용하지 못하기 때문입니다. 따라서 동작이 굉장히 오래걸리는 경우에는 성능을 저하시킬 수 있습니다. 빠르게 실행할 수 있는 값을 증감시키는 동작을 활용하는 것을 지향하고 있습니다. 관련 예제를 보도록 하겠습니다.


#include <iostream>
#include <atomic>
using namespace std;
 
int main()
{
    atomic<int> intAtomic = 1;
 
    intAtomic.fetch_add(1);         // 값 1 증가. 결과는 2
    cout << intAtomic << endl;
 
    intAtomic.fetch_sub(2);         // 값 2 감소. 결과는 0
    cout << intAtomic << endl;
 
    return 0;
}
 
cs


atomic을 이용하여 변수를 선언하고 1을 대입하였습니다. 그 후에 1을 증가시키고 2를 감소시켰습니다.  간단히 값을 증가시키고 감소시키는 연산을 개발하는 것은 아니지만 멀티스레드 환경에서 lock을 사용하지 않고 한 줄의 명령으로 방해받지 않고 실행 시킬 수 있어 자주 사용합니다. 

반응형

'SW > C++' 카테고리의 다른 글

[ C++ ] namespace에 대해 알아볼까요?  (0) 2018.12.15
C++와 객체 지향에 대해 알아볼까요?  (0) 2018.11.19
[ C++ ] mutex 개념 및 예제  (0) 2018.11.16
[ C++ ] thread 개념 및 예제  (0) 2018.11.16
[ C++ ] chrono 개념 및 예제  (0) 2018.11.16