Atomic이란?
Atomic은 멀티스레드 환경에서 데이터를 안전하게 관리할 수 있도록 보장하는 기능이다.
일반적인 변수는 여러 스레드에서 동시에 접근하면 데이터 경쟁(Race Condition)이 발생할 수 있지만,
Atomic 변수는 원자적 연산(Atomic Operation)을 통해 이러한 문제를 방지한다.
Atomic의 특징
- 원자성(Atomicity)
- 연산이 쪼개지지 않고 한 번에 수행된다.
- 실행 도중 다른 스레드가 개입할 수 없다.
- 데이터 경쟁 방지
- 여러 스레드가 동시에 접근해도 안전하게 값을 변경할 수 있다.
- 잠금 없는 동기화(Lock-free Synchronization)
- 일반적인 mutex 같은 락을 사용하지 않아 성능이 향상된다.
Atomic 연산
함수설명
load() | 현재 값 읽기 |
store(x) | 값 설정 |
fetch_add(x) | 현재 값에 x를 더하고 이전 값 반환 |
fetch_sub(x) | 현재 값에서 x를 빼고 이전 값 반환 |
exchange(x) | 현재 값을 x로 바꾸고 이전 값 반환 |
Atomic의 활용
- 멀티스레드 카운터
- 로그 시스템 (동시 접근 방지)
- 락 없는 자료구조 (예: 락-프리 큐)
Atomic을 사용하면 데이터 경쟁을 방지하면서도 성능을 최적화할 수 있다.
멀티스레드 프로그래밍에서 꼭 필요한 개념이므로, 상황에 맞게 활용하는 것이 중요하다.
테스트 해보자
#include "pch.h"
#include <iostream>
#include <thread>
#include <atomic>
static atomic<int> tempNum = 0;
void Add()
{
for (int32 i = 0; i < 100'0000; i++)
{
tempNum++;
}
}
void Sub()
{
for (int32 i = 0; i < 100'0000; i++)
{
tempNum--;
}
}
int main()
{
std::thread t1(Add);
std::thread t2(Add);
t1.join();
t2.join();
cout << tempNum << endl;
}
결과값
아토믹을 사용한 tempNum 변수는 정확하게 2000000이라는 값이 나왔다.
아토믹은 mutex와 같이 LOCK ,UNLOCK 과정이 필요없지만
만능은 아니다 아토믹은 모든 자료형에 사용이 가능할까?
아토믹의 정의를 살펴보자
- is_trivially_copyable_v<_Ty> 아토믹은 단순 복사가 가능해야하고
- is_copy_constructible_v<_Ty> 복사생성이 가능해야하고
- is_move_constructible_v<_Ty> 이동 생성이 가능해야하고
- is_copy_assignable_v<_Ty> 복사 할당이 가능해야하고
- is_move_assignable_v<_Ty> 이동 할당이 가능해야한다
위 조건을 만족하지 않으면 컴파일 에러가 발생한다.
'게임 프로그래밍 > WINDOW SERVER' 카테고리의 다른 글
쓰레드 thread (0) | 2025.02.25 |
---|---|
프로세스? 쓰레드? (0) | 2025.02.25 |