경쟁 조건(Racing condition)
지난 시간에 우리는 스레드는 운영체제로부터 프로세스가 할당받은 메모리 공간 중에 스택만을 각각이 할당받아 사용하고 그 외의 힙, 데이터, 텍스트 공간은 공유를 한다고 말했었다. 그리고 스레드는 프로세스 내에 여러 개가 존재할 수 있으며 멀티스레드 환경이라면 동시에 스레드가 작업을 한다고 했었다. 자 그러면 상상해 보자 A스레드에서 어떤 자원을 사용하고 있는데 B스레드에서도 그 자원을 읽거나 쓴다고 생각해 보자 그렇다면 실시간으로 A가 참조하는 자원은 B로 인해 오염될 수도 있을 것이다. 이런 경우처럼 스레드 간의 공유자원과 관련된 문제가 발생할 수 있고 이는 스레드의 경쟁조건(Racing Condition)이라고 한다.
스레드의 경쟁조건(또는 경쟁상태)는 여러 개의 스레드가 공유 자원에 접근하거나 수정하려고 할 때 스레드들의 실행 순서에 의존하여 예상치 못한 결과가 발생하는 상황을 말한다. 주로 공유자원에 대한 접근이나 수정이 동기화 없이 이루어지는 경우에 발생하며 아까의 경우처럼 같은 변수를 여러 스레드가 동시에 읽거나 수정하려고 할 때 발생하거나 작업의 순서를 잘못 설정하여 서로가 서로의 반환값을 기다리는 상황과 같은 경우도 발생할 수 있다. 이러한 경쟁 상태는 다양한 문제를 야기할 수 있는데 대표적으로
1. 데이터의 일관성 문제 : 여러 스레드가 동시에 같은 데이터를 수정하는 경우 스레드 간의 데이터가 일관성 없이 변경되어 예상치 못한 결과를 초래할 수 있다.
2. 교착상태 : 두 개 이상의 스레드가 서로 상대방이 접근하고 있는 자원을 기다리며 무한히 대기하는 상태를 말하며, 프로그램이 멈추는 문제가 발생한다.
3. 쓰기 후 읽기 문제 : 한 스레드가 데이터를 수정하는 도중에 다른 스레드가 같은 데이터를 읽으면, 데이터의 일관성이 깨질 수 있다.
4. 인터럽트 문제 : 인터럽트나 타이머 등의 외부 요인으로 인해 스레드의 실행이 중단될 때, 공유 자원의 상태가 일관되지 않을 수 있다.
이러한 문제를 해결하기 위해서는 스레드간의 동기화 메커니즘을 사용하여 경쟁상태를 방지하거나 제어해야 한다. 대표적인 방법으로는 뮤텍스(Mutex), 세마포어(Semaphore), 임계영역(Critical Section), 아토닉(Atomic)이 있다.
'unreal 5기' 카테고리의 다른 글
| 251015 언리얼엔진 본캠프 45일차 UCLASS와 USTRUCT (0) | 2025.10.15 |
|---|---|
| 251001 언리얼엔진 본캠프 41일차 프로세스와 스레드(3) (0) | 2025.10.01 |
| 250926 언리얼엔진 본캠프 38일차 프로세스와 스레드(1) (0) | 2025.09.26 |
| 250923 언리얼엔진 본캠프 35일차 unordered_map (0) | 2025.09.23 |
| 250918 언리얼엔진 본캠프 33일차 list (0) | 2025.09.18 |