[게임 서버] 1.2 스레드

업데이트:     Updated:

카테고리:

태그:

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

📦 1. 멀티스레딩

👉🏻 2. 스레드 요약

🧵 스레드란?

  • 스레드는 프로그램을 실행하는 가장 작은 단위이다
  • 각 프로세스는 자신만의 메모리 공간을 가지며, 다른 프로세스의 메모리에 접근할 수 없다

⚡ 스레드 vs 프로세스

  • 하나의 프로세스 안에는 여러 스레드가 존재할 수 있다
  • 같은 프로세스 안의 스레드들은 메모리를 공유하지만, 각각 독립적인 스택을 가진다

🔹 스레드 모델

  • 프로그램 실행 시, 프로세스와 함께 메인 스레드가 생성된다
  • 싱글스레드 모델은 하나의 스레드만 사용하는 구조이다
  • 멀티스레드 모델은 여러 스레드가 병렬로 작업을 처리하는 구조이다

🧠 스레드의 실행 방식

  • 프로그램은 여러 함수로 구성되어 있으며, 함수 실행 흐름을 관리하기 위해 호출 스택을 사용한다
  • 각 스레드는 서로 다른 호출 스택을 가지며, 실행 지점이나 지역 변수 사용에 차이가 생긴다

🔁 스레드 생명주기

스레드는 다음과 같은 상태를 순환한다:

---
config:
  look: handDrawn
  theme: neo-dark
  layout: fixed
---
flowchart LR
    생성[생성]
    실행중["Runnable(실행중)"]
    대기중["Blocked(대기중)"]
    소멸[소멸]

    생성 -- 시작됨 --> 실행중
    실행중 -- 기다림 --> 대기중
    대기중 -- 깨어남 --> 실행중
    실행중 -- 종료 --> 소멸

🔥 멀티스레딩 흐름 예시

멀티스레드 프로그램은 메인 스레드와 서브 스레드들이 독립적으로 작업을 진행한다

void main() {
    t1 = CreateThread(ThreadProc, 123);  // 새 스레드 시작
    ...
    t1.join();                           // 스레드 종료 대기
}

ThreadProc(int) {
    ...
}

흐름도:

---
config:
  look: handDrawn
  theme: neo-dark
  layout: fixed
---
flowchart-elk TD
    subgraph Main_Thread [메인 스레드]
        direction LR
        A1[스레드 시작] --> A2[처리중]
        A2 --> A3[join 호출 및 대기]
        A3 --> A4[메인 스레드 종료]
    end

    subgraph New_Thread [서브 스레드]
        direction LR
        B1[작업 수행] --> B2[스레드 종료]
    end

    A1 --> B1
    B2 --> A3

※ 메인 스레드가 먼저 종료되면, 다른 스레드는 여전히 동작할 수 있으며, 이를 좀비 프로세스라고 부른다

🛠️ 스레드 생성 방법

운영체제나 사용 언어에 따라 스레드 생성 방법이 다르다

Windows 예시

DWORD threadID;
ThreadParam threadParam{123};
CreateThread(..., ThreadProc, &threadParam, ..., &threadID);

Linux/Unix 예시

pthread_t thread;
ThreadParam threadParam{123};
pthread_create(&thread, NULL, ThreadProc, &threadParam);

Modern C++ 예시

std::thread t1(ThreadProc, 123);

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

댓글남기기