본문 바로가기
개발 (언어)/C++

[MultiThread] 쓰레드 생성

by 진현개발일기 2024. 4. 7.

■ C++ 11 이전 및 이후

이전에는 각 운영체제마다 제공하는 함수가 다르기 때문에 문서를 찾아보고 해야했다. 하지만, C++ 11(모던C++)이후 부터는 쓰레드 생성이 표준에 추가되어 #include <thread>를 통해 굉장히 편리하게 스레드를 만들 수 있게 되었다.

■ 사용 법

(1) #include <thread> 헤더를 추가한다.
(2) 일반적인 변수를 선언하듯이 std::thread t; 와 같이 스레드를 선언한다.
(3) 다만, Thread가 처음 실행되는 순간에는 실행이 되어야 하는 함수를 우리가 넣어줘야 한다.

 

(예) 스레드 생성

 

(4) 하지만 위 코드를 그대로 사용하면 크래쉬가 난다. 그 이유는
- 메인 스레드가 종료가 되었는데 자식 스레드가 끝나지 않았기 때문에 크래쉬가 일어난다.
- 그러므로 메인 스레드는 자식 스레드가 끝날 때 까지 대기시켜줘야 한다. 
- 이때 자식 쓰레드의 join 함수를 사용하면, 해당 함수를 끝내고 스레드가 다시 돌아와서 합류할 때까지 대기시켜준다

 

 

▼ 자식 스레드가 HelloThread 함수에 들어간 모습

▼ 메인 스레드가 대기하고 있는 모습

 

 

(5) 스레드.detach()라는 함수로 주 스레드가 자식의 스레드에 관여하지 않고 독립할 수 있도록 해주는 함수가 있는데 이를 사용하는 경우는 거의 없다.

 

(6) 함수에 인자를 넘겨줄 수 있다.


(7) 병렬적으로 실행해줄 수 있는 하드웨어의 CPU 코어 개수를 알 수 있는 방법은 스레드.hardware_concurrency(); 의 함수를 통해 얻을 수 있고, 스레드의 고유 아이디는 get_id() 함수를 통해 얻을 수 있다.


이에 따라 스레드의 개수를 몇 개 사용할지도 잘 고민헤봐야 한다. 보통은 본인이 활용할 수 있는 코어 개수를 맥시멈으로 스레드를 생성해서 사용한다. (현재 글쓴이 환경에선 24개 가능)

 


(8) 메모리 구조를 항상 신경을 써야 한다.

- Stack 메모리는 Thread마다 고유의 영역이 할당 된다.

- Code 영역은 공유 영역이지만 딱히 수정되는 공간이 아니기에 크게 신경 쓸 필요는 없다.

- Heap 영역과 Data 영역은 수정할 수 있는 변수들이 내포되어 있고 이들은 쓰레드끼리 공유하는 영역이다.

 

(9) 단일 스레드에선 문제가 되지 않던 부분들이 멀티스레딩에선 문제가 생길 수 있다. 하지만, MMORPG를 만들 때에는 멀티스레딩은 필수적이다. 즉, 성능을 최대한 끌어올릴 수 있지만 매우 철저하게 관리해줘야 한다.

728x90