뮤텍스를 통해서 전역 변수를 동기화하여 하나씩 증가시킬 수 있다. 그러나 뮤텍스와 같은 lock을 이용하여 개발하는 경우, 사용자가 잘못 사용할 때 교착 상태와 같은 문제를 야기시킬 수 있다. C++11에서는 atomic을 이용하여 뮤텍스와 같이 lock, unlock을 사용하지 않고 값을 증가시키거나 값을 감소시킬 수 있는 기능을 제공하고 있다.
atomic : atomic 변수를 선언할 수 있는 데이터형.
fetch_add : atomic의 멤버 함수로, 값을 증가시키는 함수.
fetch_sub : atomic의 멤버 함수로, 값을 감소시키는 함수.
atomic으로 설정된 변수에는 초기에만 값을 대입할 수 있다. 그 이외에는 대입이 불가합니다. 대신 값을 증가, 감소 시키는 역할만 수행한다. 그 이유는 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;
}
atomic을 이용하여 변수를 선언하고 1을 대입하였다. 그 후에 1을 증가시키고 2를 감소시켰다. 멀티스레드 환경에서 lock을 사용하지 않고 한 줄의 명령으로 방해받지 않고 실행 시킬 수 있어 자주 사용된다.
'CS > 네트워크' 카테고리의 다른 글
TCP와 UDP의 특징과 차이 (0) | 2022.11.04 |
---|---|
C# 원자적 연산 (Interlocked 클래스) (0) | 2022.07.26 |
Thread 사용법 및 생성 (0) | 2022.07.24 |
데드락 (Deadlock) 의미 & 조건 (0) | 2022.07.24 |
멀티 스레드 (Multi Thread) 소스코드 (0) | 2022.07.24 |