반응형
글을 쓰기 앞 서, 쓰레드(Thread)에 대한 개념만 간단하게 설명하고자 한다.
왜 필요한가?
여러 작업을 동시에 수행하려면, 병렬로 처리해야 하기 때문에.
멀티 프로세스와 멀티 쓰레드의 차이는?
Heap 영역 혹은 Data 영역의 자원을 공유할 수 있다. 쓰레드 별로 각각의 Stack 메모리를 갖고 있다.
Atomic을 쓰는 이유와 멀티 쓰레드의 문제점
자원을 공유하기에 생기는 문제로 경합문제가 있다.
void Add() {
for (int32 i = 0; i < 100'0000; i++)
{
sum++;
}
}
void Sub() {
for (int32 i = 0; i < 100'0000; i++)
{
sum--;
}
}
int main()
{
thread t1(Add);
thread t2(Sub);
t1.join();
t2.join();
cout << sum << endl;
}
main 함수가 끝날 때 sum의 값은 알 수 없다.
이것이 경합 문제 때문인데. 왜 일어나는지 어셈블러를 까보면 알 수 있다.
간단히 우리가 sum++로 한 줄 짜리 코드를 만들었지만 컴파일 과정에서 코드가 3줄로 늘어난다.
이걸 코드로 단순히 표현하자면
int32 eax = sum;
eax = eax+1;
sum = eax
컴파일을 하면 CPU에선 이런 작업을 하고 있다는 얘기다.
이 때, 쓰레드 1번이 eax + 1 작업을 하고 있고 쓰레드 2번에선 sum = eax 작업을 하고 있다 가정을 한다면.
최종적으로 쓰레드 1번이 sum = eax를 작업을 실행 하면, 기존에 쓰레드 2번이 작업했던 내용이 사라진다.
이것을 방지할 수 있는 것이 Atomic인데.
Atomic atom(원자) All or Nothing 다 실행되거나 다 실행 안되거나.
경합이 일어났을 때, 완료가 될 때 까지 살짝 대기함.
순서를 정하는 곳은 CPU, 데이터에 접근했을 때 끝날 때 까지 막아버림.
아토믹만 사용하면? 연산이 생각보다 많이 느림. 언제 어디서든 막 사용하면 안된다.
반응형
'프로그래밍-기본기 > C++' 카테고리의 다른 글
(쓰레드) Spin Lock (0) | 2023.09.25 |
---|---|
(쓰레드) Mutex (0) | 2023.09.08 |
스마트 포인터 (1) | 2023.09.05 |