[게임 서버] 1.3 멀티스레드 프로그래밍은 언제 해야 할까?

업데이트:     Updated:

카테고리:

태그:

이 글은 아래의 책을 자세히 정리한 후, 정리한 글을 GPT에게 요약을 요청하여 작성되었습니다.
게임 서버 프로그래밍 교과서, 배현직 저자

📦 1. 멀티스레딩

👉🏻 항목 3: 멀티스레드 프로그래밍은 언제 해야 할까?

1. 멀티스레딩이 필요한 상황은?

  1. 오래 걸리는 일 하나와, 빨리 끝나는 일 여러 개를 동시에 해야 할 때
  2. 어떤 긴 처리가 진행되는 동안 다른 짧은 작업을 처리해야 할 때
  3. 기기에 있는 모든 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 멀티스레드로 소수 구하기

구현 방식

  1. 전역 변수 num에서 각 스레드가 값을 하나씩 가져간다.
  2. 가져온 값이 소수인지 판단
  3. 소수면 primes에 추가
  4. 모든 스레드가 끝나면 결과 출력
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 병렬 처리로 성능 극대화

GameServer 카테고리 내 다른 글 보러가기

댓글남기기