뮤텍스를 통해서 전역 변수를 동기화하여 하나씩 증가시킬 수 있습니다. 그러나 일반적으로 뮤텍스와 같은 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 |