[C++]Atomic

강병우·2023년 7월 10일
0

멀티스레드

목록 보기
2/3

2023-06-30에 작성된 소스코드입니다

Atomic

두 개 이상의 스레드가 하나의 변수에 대해 수정을 하면 이상한 쓰레기 값이 나온다. 컴파일러는 메모리에서 값을 읽고 레지스터로 불러와서 값을 수정하여 저장하는데, 이 과정에서 같은 메모리 영역을 다른 스레드에서 참조할 경우 꼬이게 되는 것이다.

이를 방지하기 위해 사용하는 것이 atomic이다. 읽고 쓰는 것을 동시에 처리할 수 있다.

#include "pch.h"
#include <iostream>
#include "CorePch.h"
#include <thread>
#include <atomic>

// 두 스레드에서 수정을 하면 이상한 값이 나옴. 덮어쓰기 때문.
// 동기화 필요!

// Atomic : All-or-Nothing
atomic<int32> sum = 0;

void Add()
{
	for (int32 i = 0; i < 100'0000; i++)
	{
		sum.fetch_add(1);
		/*
		int32 eax = sum;
		// eax = 0
		eax = eax + 1;
		// eax = 1
		sum = eax;
		// sum = 1
		*/
	}
}

void Sub()
{
	for (int32 i = 0; i < 100'0000; i++)
	{
		sum.fetch_add(-1);
		/*
		int32 eax = sum;
		// eax = 0
		eax = eax - 1;
		// eax = -1
		sum = eax;
		// sum = -1
		*/
	}
}


int main()
{

	thread t1(Add);
	thread t2(Sub);

	t1.join();
	t2.join();
	cout << sum << endl;

    return 0;

}
  • atomic<int32> sum : 원자적 처리를 할 수 있는 int32타입 변수를 선언한다.

참조 : [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

0개의 댓글

관련 채용 정보