2023-06-30에 작성된 소스코드입니다
두 개 이상의 스레드가 하나의 변수에 대해 수정을 하면 이상한 쓰레기 값이 나온다. 컴파일러는 메모리에서 값을 읽고 레지스터로 불러와서 값을 수정하여 저장하는데, 이 과정에서 같은 메모리 영역을 다른 스레드에서 참조할 경우 꼬이게 되는 것이다.
이를 방지하기 위해 사용하는 것이 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타입 변수를 선언한다.