Atomic이란?

Atomic은 멀티스레드 환경에서 데이터를 안전하게 관리할 수 있도록 보장하는 기능이다.
일반적인 변수는 여러 스레드에서 동시에 접근하면 데이터 경쟁(Race Condition)이 발생할 수 있지만,
Atomic 변수는 원자적 연산(Atomic Operation)을 통해 이러한 문제를 방지한다.

Atomic의 특징

  1. 원자성(Atomicity)
    • 연산이 쪼개지지 않고 한 번에 수행된다.
    • 실행 도중 다른 스레드가 개입할 수 없다.
  2. 데이터 경쟁 방지
    • 여러 스레드가 동시에 접근해도 안전하게 값을 변경할 수 있다.
  3. 잠금 없는 동기화(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

+ Recent posts