묻공러
[게임서버 섹션2 Note] 스레드 생성
묻공러
묻지마공부
묻공러
전체
오늘
어제
  • 분류 전체보기 (487)
    • C (54)
      • [코드조선] C 핵심 (35)
      • [언어본색] C 기초 (19)
    • C++ (72)
      • [루키스] C++ (9)
      • [루키스] 콜백함수 (6)
      • [루키스] STL (8)
      • [루키스] Modern C++ (11)
      • [노코프] C++ (10)
      • [노코프] Tips (16)
      • [일지] C++ (12)
    • 자료구조 & 알고리즘 (50)
      • [코드조선] C 자료구조 & 알고리즘 (6)
      • [합격자되기] C++ 코딩테스트 (12)
      • [루키스] C++ 자료구조 & 알고리즘 (32)
    • CS (69)
      • [널널한 개발자] CS 개론 (19)
      • [혼자 공부하는] 컴퓨터 구조 (16)
      • [혼자 공부하는] 운영체제 (18)
      • [널널한 개발자] 네트워크 (16)
    • 게임 그래픽스 (46)
      • [전북대] OpenGL (25)
      • [일지] DirectX (21)
    • 게임 엔진 (124)
      • [코드조선] 언리얼 (53)
      • [코드조선] 언리얼 데디서버 (8)
      • [일지] 언리얼 (59)
      • [일지] 언리얼 (2) (3)
      • 유니티 (1)
    • 게임 서버 (17)
    • 게임 수학 & 물리 (19)
      • 게임 수학 (12)
      • 게임 물리 (7)
    • GIT & GITHUB (4)
    • 영어 (18)
      • [The Outfit] 대본 공부 (11)
      • the others (7)
    • 그 외 (14)
      • In (5)
      • Out (5)
      • Review (4)

인기 글

최근 글

hELLO · Designed By 정상우.
게임 서버

[게임서버 섹션2 Note] 스레드 생성

2024. 12. 28. 20:39

스레드 생성 구버전 방식

#include <windows.h>
#include <iostream>

// 스레드 함수
DWORD WINAPI ThreadFunction(LPVOID lpParam) {
    ...
}

int main() {
    // 스레드에 전달할 매개변수
    int threadParam = 42;

    // 스레드 생성
    HANDLE hThread = CreateThread(
        nullptr,            // 기본 보안 속성
        0,                  // 기본 스택 크기
        ThreadFunction,     // 실행할 스레드 함수
        &threadParam,       // 스레드 함수에 전달할 매개변수
        0,                  // 스레드 실행 옵션 (0이면 즉시 실행)
        nullptr             // 스레드 ID (필요하지 않음)
    );

   ...
}

 

스레드 생성 C++11 방식

위의 구버전 방식은 윈도우 환경에서만 가능하기에

리눅스를 비롯한 다양한 환경에서 코드를 활용하기 위해서

C++11부터 도입된 방식을 사용하는 것이 좋다

#include <thread>

void HelloThread()
{
	cout << "Hello Thread" << endl;
}


int main()
{
	
	std::thread t(HelloThread);

	cout << "Hello Main" << endl;

	t.join();
	
}

 

단일 스레드 vs. 멀티 스레드

#include <thread>

void HelloThread()
{
	cout << "Hello Thread" << endl;
}


int main()
{
	// 단일 스레드로 실행
	HelloThread();

	// 멀티 스레드로 실행
	std::thread t(HelloThread);


	cout << "Hello Main" << endl;

	t.join();
	
}

 

핵심 키워드

int32 count = t.hardware_concurrency();// 시스템이 동시에 효율적으로 실행할 수 있는 CPU 코어 개수
auto id = t.get_id();// 스레드 id
t.detach();// 스레드의 연결을 끊는 경우
bool isJoined = t.joinable();// 스레드가 연결된 상태인지 확인
t.join();// 스레드의 연결을 진행

특히, join 키워드는 스레드의 연결을 진행하기 때문에

해당 스레드 작업이 끝날 때까지 종료되지 않도록 한다

 

스레드 생성 시점

#include <thread>

void HelloThread()
{
	cout << "Hello Thread" << endl;
}


int main()
{
	std::thread t;

	auto id1 = t.get_id();// 0
	bool isJoined1 = t.joinable();// false

	t = std::thread(HelloThread);

	auto id2 = t.get_id();// 할당된 id
	bool isJoined2 = t.joinable();// true


	if (t.joinable())
		t.join();

}

위의 코드를 보면

스레드 t의 함수가 들어와야

실제로 id가 생성되고 joinable도 true가 반환된다

참고로, join 키워드를 사용하기 전에

joinable을 사용해서 스레드 생성(연결) 여부를 확인하고 사용하는 것이 추천된다

 

함수 인자 전달 방법

#include <thread>

void HelloThread(int32 num)
{
	cout << num << endl;
}


int main()
{
	std::thread t = std::thread(HelloThread, 1);

	if (t.joinable())
		t.join();

}

 

vector 활용 예시

#include <thread>

void HelloThread(int32 num)
{
	cout << num << endl;
}


int main()
{
	vector<std::thread> v;

	for (int32 i = 0; i < 10; i++)
	{
		v.push_back(std::thread(HelloThread, i));
	}

	for (int32 i = 0; i < 10; i++)
	{
		if (v[i].joinable())
			v[i].join();
	}

	cout << "Hello Main" << endl;

}

 

저작자표시 비영리 변경금지 (새창열림)

'게임 서버' 카테고리의 다른 글

[게임서버 섹션2 Note] Lock 기초  (0) 2024.12.28
[게임서버 섹션2 Note] Atomic  (0) 2024.12.28
[게임서버 섹션2 Note] 멀티스레드 개론  (0) 2024.12.28
[게임서버 섹션1 Note] 환경 설정  (0) 2024.12.28
[게임서버 섹션1 Note] 서버 개론  (0) 2024.12.28
'게임 서버' 카테고리의 다른 글
  • [게임서버 섹션2 Note] Lock 기초
  • [게임서버 섹션2 Note] Atomic
  • [게임서버 섹션2 Note] 멀티스레드 개론
  • [게임서버 섹션1 Note] 환경 설정
묻공러
묻공러
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.