[게임 서버] 1.3 멀티스레드 프로그래밍은 언제 해야 할까?
카테고리: GameServer
태그: GameServer
이 글은 아래의 책을 자세히 정리한 후, 정리한 글을 GPT에게 요약을 요청하여 작성되었습니다.
게임 서버 프로그래밍 교과서, 배현직 저자
📦 1. 멀티스레딩
👉🏻 항목 3: 멀티스레드 프로그래밍은 언제 해야 할까?
1. 멀티스레딩이 필요한 상황은?
- 오래 걸리는 일 하나와, 빨리 끝나는 일 여러 개를 동시에 해야 할 때
- 어떤 긴 처리가 진행되는 동안 다른 짧은 작업을 처리해야 할 때
- 기기에 있는 모든 CPU 코어를 최대한 활용하고 싶을 때
1.1 오래 걸리는 일 + 빨리 끝나는 일 같이 처리
🎮 예시: 게임 로딩
게임 로딩 화면에서 배경 이미지가 부드럽게 출력되며, 그 뒤에서 리소스들이 로드되는 상황을 생각해보자.
✅ 싱글스레딩이라면?
LoadScene() {
Render();
LoadScene();
Render();
LoadModel();
Render();
LoadTexture();
Render();
LoadAnimation();
Render();
LoadSound();
}
- 렌더링과 로딩을 번갈아가며 실행
- 프레임이 끊기고 로직도 복잡해짐
✅ 멀티스레딩이라면?
bool isStillLoading;
Thread1 {
isStillLoading = true;
while(isStillLoading) {
FrameMove();
Render();
}
}
Thread2 {
LoadScene();
LoadModel();
LoadTexture();
LoadAnimation();
LoadSound();
isStillLoading = false;
}
- Thread1: 렌더링 전담 → 프레임 부드럽게
- Thread2: 리소스 로딩
- 역할이 분리되어 코드도 더 간결하고 효율적
1.2 긴 작업 중 다른 짧은 작업 처리
💽 예시: 디스크 I/O
플레이어 정보를 디스크에서 읽는 중이라면?
- 디스크 응답을 기다리는 동안 CPU는 할 일이 없음
- CPU는 놀고, 프로그램은 정지 상태처럼 느려짐
✅ 해결 방법은?
- 멀티스레딩으로 디스크 작업과 나머지 처리를 병렬로 수행
- 또는 비동기 프로그래밍을 활용
1.3 CPU 자원 100% 활용
🧠 요즘 CPU는 ‘속도’보다 ‘코어 수’가 중요!
- 클록 속도는 4GHz 언저리에서 멈춤
- 하지만 코어는 4, 8, 16개까지 계속 늘어남
➡️ 싱글스레드라면 4코어 CPU에서도 성능의 1/4만 사용 ➡️ 멀티스레딩을 쓰면 모든 코어를 동원 가능
1.3.1 싱글스레드로 소수 구하기
const int MaxCount = 150000;
for (int i = 1; i <= MaxCount; i++) {
if (IsPrimeNumber(i)) {
primes.push_back(i);
}
}
🕒 실행 시간: 약 3920ms 💻 CPU 사용량: 전체의 25% (1코어만 사용)
1.3.2 멀티스레드로 소수 구하기
구현 방식
- 전역 변수
num
에서 각 스레드가 값을 하나씩 가져간다. - 가져온 값이 소수인지 판단
- 소수면
primes
에 추가 - 모든 스레드가 끝나면 결과 출력
int num = 1;
vector<int> primes;
for (int i = 0; i < ThreadCount; i++) {
shared_ptr<thread> t(new thread([&]() {
while (true) {
int n = num;
num++;
if (n >= MaxCount)
break;
if (IsPrimeNumber(n)) {
primes.push_back(n); // ❗️여기서 충돌 발생 가능
}
}
}));
threads.push_back(t);
}
🔧 그런데 위 코드에서 에러 발생!
An invalid parameter was passed to a function
that considers invalid parameters fatal.
👉 이유는 다음 장에서 다룰 예정이다.
✅ 핵심 요약
상황 | 멀티스레딩이 필요한 이유 |
---|---|
UI 렌더링 + 리소스 로딩 | 작업 분리로 프레임 유지 |
긴 I/O 작업 + 사용자 입력 처리 | CPU 놀지 않게 함 |
코어 수 많은 CPU | 병렬 처리로 성능 극대화 |
댓글남기기